JTable刷新了未显示的数据

时间:2013-03-01 01:02:03

标签: java mysql swing jdbc jtable

这是一个JDBC项目。来自WAMP服务器上的mySql数据库的数据显示在jtable中。现在,我希望在我的Spinner按钮上输入用户输入的ID,并删除具有该ID的行。我做了一个SQL查询,一切正常,但是当执行我的查询时,myjtable上的数据不会刷新。我单击我的JNazad按钮(我的后退按钮),然后重新进入该窗口,以便我的Jtable显示刷新的数据。我想我没有在NapraviTablicu方法中正确实现FireTableModel,但不知道我做错了什么:

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("sun.jdbc.odbc.JdbcOdbcDriver");
            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);
        model.fireTableDataChanged();
        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();
            model.fireTableDataChanged();
        }

        private void IzvrsiQuery() {
            Object sp = Spinner.getValue();
            ID = sp.toString();
            SqlQuery=SqlQuery+ID;
            try {
                Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
                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 = 1;
        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 = 3;
        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();
            }
        });
    }
}

首先,非常感谢您的回答!

当我使用PreparedStatement时,我得到了这个例外:

java.lang.ClassCastException: com.mysql.jdbc.StatementImpl cannot be 
  cast to java.sql.PreparedStatement 

..所以我必须使用经典Statement

此外,我每次都尝试不创建JTable,我只是在我的NapraviTablicu方法中创建模型,然后在我的构造函数中使用该模型,只需将其添加到表Tablica ,但现在表格没有显示任何数据。我不知道我是否在我的代码中正确实现了提示......

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 void 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);
        //model.fireTableDataChanged();

    }

    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();
            //model.fireTableDataChanged();
        }

        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", "");
                PreparedStatement Stat = (PreparedStatement) 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=new JTable(model);
        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 = 1;
        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 = 3;
        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();
            }
        });
    }
}

1 个答案:

答案 0 :(得分:3)

您需要使用com.mysql.jdbc.Driver作为JDBC驱动程序,而不是通用JDBC/ODBC驱动程序。此外,您无需致电fireTableDataChanged,您的TableModel会将此称为“{1}}。


附注:

  • 无需每次都创建JTableDefaultTableModel是可变的TableModel,可以更新。
  • PreparedStatement被认为比Statement
  • 更安全
  • 如果您不添加新功能,则无需延长JFrame。直接实例是首选。
  • 为了可维护性,请考虑将您的数据库/非UI代码与UI代码分开。

更新:

要创建PreparedStatement,请使用Connection#prepareStatement而不是Connection#createStatement

PreparedStatement Stat = con2.prepareStatement(SqlQuery);

然后在执行查询时,必须使用{em> 为空execute语句 参数列表:

int rez = stat.executeUpdate();

最好放置Statement&amp; Connection&amp; close块中的finally个语句。 Java对变量名称使用初始小写字母,这将使SqlQuery sqlQuery成为。