【问题标题】:JTable doesn't refresh when my database query is executed执行我的数据库查询时 JTable 不刷新
【发布时间】:2013-02-15 20:48:28
【问题描述】:

这是一个 JDBC 项目。来自 WAMP 服务器上的 MySQL 数据库的数据显示在 JTable 中。我希望在我的JSpinner 上使用用户输入的 ID 从表中删除具有该 ID 的行。我做了一个 SQL 查询,一切正常,但我的 JTable 上的数据在我的查询执行时不会刷新。我单击我的JNazad 按钮(我的后退按钮),然后重新进入该窗口,以便我的JTable 显示刷新的数据。我没有在我的NapraviTablicu 方法中实现FireTableModel,因为它的DefaultTableModel,并且更新是自动完成的。我不知道我做错了什么:

public class GUIBDelete extends JFrame{

    private SpinnerModel SM;
    private JSpinner Spinner;
    private JLabel LUnos;
    private JButton BNazad, BIzvrsi;
    private String ID, SqlQuery;
    private Vector NaziviKolona = new Vector();
    private Vector Podaci = new Vector();
    private JTable Tablica=new JTable();
    private JScrollPane ScrollPane;
    private DefaultTableModel model;


    private JTable NapraviTablicu(){
        try {
            String SqlQuery = "SELECT * FROM `nfc_baza`";
            Podaci.clear();
            NaziviKolona.clear();
            Class.forName("com.mysql.jdbc.Driver");
            Connection con = DriverManager.getConnection("jdbc:mysql://"
                    + "localhost:3306/nfc", "root", "");

            Statement Stat = con.createStatement();
            ResultSet Rez = Stat.executeQuery(SqlQuery);
            ResultSetMetaData md = Rez.getMetaData();
            int columns = md.getColumnCount();
            for (int i = 1; i <= columns; i++) {
                NaziviKolona.addElement(md.getColumnName(i));
            }
            while (Rez.next()) {
                Vector red = new Vector(columns);
                for (int i = 1; i <= columns; i++) {
                    red.addElement(Rez.getObject(i));
                }
                Podaci.addElement(red);
            }
            Rez.close();
            Stat.close();
            con.close();
        } catch (Exception e) {
            System.out.println(e);
        }
        model = new DefaultTableModel(Podaci, NaziviKolona);
        JTable table = new JTable(model);

        return table;

    }

    ActionListener a1 = new ActionListener() {
        public void actionPerformed(ActionEvent a) {
            dispose();
            new GUIIzbornik();
        }
    };


    ActionListener a2 = new ActionListener() {
        public void actionPerformed(ActionEvent a) {
            ID=null;
            SqlQuery = "DELETE FROM `nfc`.`nfc_baza` WHERE `nfc_baza`.`ID` = ";
            IzvrsiQuery();
        }

        private void IzvrsiQuery() {
            Object sp = Spinner.getValue();
            ID = sp.toString();
            SqlQuery=SqlQuery+ID;
            try {
                Class.forName("com.mysql.jdbc.Driver");
                Connection con2 = DriverManager.getConnection(
                        "jdbc:mysql://" + "localhost:3306/nfc", "root", "");
                Statement Stat = con2.createStatement();
                int Rez = Stat.executeUpdate(SqlQuery);
                Stat.close();
                con2.close();
                JOptionPane.showMessageDialog(null, "Uspješno izvrseno!",
                        "Poruka!", JOptionPane.INFORMATION_MESSAGE);

            } catch (Exception e) {
                System.out.println(e);
            }

        }
    };


    GUIBDelete(){
        setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        Tablica=NapraviTablicu();
        ScrollPane = new JScrollPane(Tablica);
        c.fill = GridBagConstraints.BOTH;
        c.insets = new Insets(2, 2, 2, 2);
        c.weightx = 0.1;
        c.weighty = 0.1;
        c.gridwidth = 4;
        c.gridheight = 2;
        c.gridx = 0;
        c.gridy = 0;
        add(ScrollPane, c);


        LUnos= new JLabel("<html><br>Unesite ID elementa</br> kojeg želite obrisati:<html>");
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 1;
        c.gridheight = 1;
        add(LUnos, c);

        SM = new SpinnerNumberModel(1, 1, 1000, 1);
        Spinner = new JSpinner(SM);
        c.gridx = 2;
        c.gridy = 2;
        c.gridwidth = 2;
        add(Spinner, c);

        BNazad = new JButton("Nazad");
        c.gridx = 0;
        c.gridy = 3;
        c.gridwidth = 1;
        BNazad.addActionListener(a1);
        add(BNazad, c);

        BIzvrsi = new JButton("Izvrši");
        c.gridx = 2;
        c.gridy = 3;
        BIzvrsi.addActionListener(a2);
        add(BIzvrsi, c);

        setSize(400, 500);
        setTitle("Brisanje podataka");
        setVisible(true);
        setLocationRelativeTo(null);

    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                GUIBDelete i = new GUIBDelete();
            }
        });
    }
}

【问题讨论】:

    标签: java swing jdbc jtable refresh


    【解决方案1】:

    您似乎正在从数据库表中删除一行,并且您希望 JTable 反映更改。在izvrsiQuery() 中更新您的TableModel,JTable 将自行更新。例如,

    ...
    con2.close();
    model.removeRow(((Number)(spinner.getValue())).intValue() - 1);
    JOptionPane.showMessageDialog(...);
    ...
    

    请注意,行号从0 开始,使用RowSorter 时必须进行转换。

    顺便说一句,如果您使用常见的 Java 命名约定并排除常量,您的代码将更容易被其他人阅读。

    附录:该示例只是按数字删除了一行。您必须在 TableModel 中搜索与已删除的 ID 对应的行。

    附录:虽然不太实用,但您可能希望在使用 setModel() 进行 DML 操作后从数据库中刷新整个表,如 here 所示。

    【讨论】:

    • 对不起,你不明白我的意思。当 JSpinner 更改值时,我不希望我的表数据发生更改。我希望我的 jtable 在执行查询时更改数据,并且当用户输入要在 Jspinner 上删除的行的 ID 时发生这种情况,然后他单击 Jbutton“Izvrsi”(我的查询已执行),那么 Jtable 必须更改数据...
    • OK,把napraviTablicu()改成TableModel,然后tablica.setModel()刷新表格,如图here。
    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多