I'm making a GUI Project for database there are two classes which are for GUI's. And connector class is used to connect from user credentials. If credentials are correct than it fetch all data in the from of AbstractTableModel. When program run first GUI has a button in which we click it and it fetch all data in underlying TableModel. But i'm facing two problems. First in GUI2 class, sometimes it open like this.
and sometimes it show like this
I don't know why it's happening. And second problem is when we select any row from table and click on DeleteSelectedRow button it delete the row. This button has a ActionListener in GUI2 class. But what i want is i automatic update the table when row has been deleted. How can i do that?
class for first GUI
public class Gui extends JFrame {
    private static Connector conni;
    private Connection conn = null;
    private JButton bt;
    private JPanel panel;
    public Gui() {
        super("Frame");
        panel = new JPanel();
        bt = new JButton("Connect to Database 'World'");
        panel.add(bt);
        bt.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                conn = conni.Connector();
                if (conn != null) {
                    dispose();
                    new Gui2(conn);
                } else {
                    System.out.println("Return false");
                }
            }
        });
        add(panel);
        pack();
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
Connector class
public class Connector {
    private static Connection conn = null;
    public static Connection Connector() {
        String data = "jdbc:mysql://localhost/world";
        String user = "root";
        String pass = "toot";
        try {
            conn = DriverManager.getConnection(data, user, pass);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
        if (conn != null) {
            System.out.println("Connection Suceess");
            return conn;
        } else {
            return conn;
        }
    }
}
class for second GUI2
public class Gui2 extends JFrame {
    private Statement state = null;
    private ResultSet rs = null;
    private JButton bt, delete;
    private JTextField text;
    private JPanel panel;
    private GridBagLayout layout;
    private GridBagConstraints constraints;
    public Gui2(Connection conn) {
        layout = new GridBagLayout();
        constraints = new GridBagConstraints();
        panel = new JPanel();
        panel.setLayout(layout);
        text = new JTextField(15);
        bt = new JButton("Submit Query");
        delete = new JButton("Delete Selected Row");
        constraints.insets = new Insets(5, 2, 5, 10);
        constraints.gridy = 0;// row 0
        constraints.gridx = 0;// column 0
        // TextField add on JPanel with given constraints
        panel.add(text, constraints);
        constraints.gridx++;
        panel.add(delete, constraints);
        constraints.gridx++;
        panel.add(bt, constraints);
        // North BorderLayout
        add(panel, BorderLayout.NORTH);
        try {
            state = conn.createStatement();
            rs = state.executeQuery("select * from city");
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
        JTable table = new JTable();
        JScrollPane spane = new JScrollPane(table);
        add(spane, BorderLayout.CENTER);
        table.setModel(new TableModel(rs));
        delete.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                int rowIndex = table.getSelectedRow();
                Object columnIndexValue = table.getModel().getValueAt(rowIndex, 0);
                String columnName = table.getModel().getColumnName(0);
                String query = "delete from world.city" + " where " + columnName + "=" + columnIndexValue;
                try {
                    PreparedStatement pre = conn.prepareStatement(query);
                    pre.executeUpdate();
                    JOptionPane.showMessageDialog(null, "Row Deleted Successfully");
                } catch (Exception e1) {
                    JOptionPane.showMessageDialog(null, e1.getMessage());
                }
            }
        });
        setSize(817, 538);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }
}
Tablemodel Class
public class TableModel extends AbstractTableModel {
    private List ColumnHeader;
    private List tableData;
    private List rowData;
    private int totalcolumn;
    public TableModel(ResultSet rs) {
        try {
            ResultSetMetaData meta = rs.getMetaData();
            totalcolumn = meta.getColumnCount();
            ColumnHeader = new ArrayList(totalcolumn);
            tableData = new ArrayList();
            for (int i = 1; i <= totalcolumn; i++) {
                ColumnHeader.add(meta.getColumnName(i));
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
        SwingWorker<Boolean, List<Object>> worker = new SwingWorker<Boolean, List<Object>>() {
            @Override
            protected Boolean doInBackground() throws Exception {
                while (rs.next()) {
                    rowData = new ArrayList(totalcolumn);
                    for (int i = 1; i <= totalcolumn; i++) {
                        rowData.add(rs.getObject(i));
                    }
                    publish(rowData);
                }
                return true;
            }
            @Override
            protected void process(List chunks) {
                tableData.add(chunks);
            }
            @Override
            protected void done() {
                try {
                    Boolean status = get();
                    JOptionPane.showMessageDialog(null, "Task is DONE");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        };
        worker.execute();
    }// constructor end
    @Override
    public int getColumnCount() {
        return ColumnHeader.size();
    }
    public String getColumnName(int columnIndex) {
        return (String) ColumnHeader.get(columnIndex);
    }
    @Override
    public int getRowCount() {
        return tableData.size();
    }
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        List rowData2 = (List) tableData.get(rowIndex);
        return rowData2.get(columnIndex);
    }
}


