Java 未显示JTable刷新的数据

Java 未显示JTable刷新的数据,java,mysql,swing,jdbc,jtable,Java,Mysql,Swing,Jdbc,Jtable,这是一个JDBC项目。WAMP服务器上mySql数据库中的数据显示在jtable中。现在,我希望用户在我的Spinnerbutton上输入ID并删除具有该ID的行。我进行了SQL查询,所有操作都正常,但执行查询时myjtable上的数据不会刷新。我单击我的JNazad按钮(我的后退按钮),然后重新进入该窗口,以便我的Jtable显示刷新的数据。我认为我在NapGravitablicu方法中没有正确实现FireTableModel,但不知道我做错了什么: public class GUIBDele

这是一个JDBC项目。WAMP服务器上mySql数据库中的数据显示在jtable中。现在,我希望用户在我的Spinnerbutton上输入ID并删除具有该ID的行。我进行了SQL查询,所有操作都正常,但执行查询时myjtable上的数据不会刷新。我单击我的JNazad按钮(我的后退按钮),然后重新进入该窗口,以便我的Jtable显示刷新的数据。我认为我在NapGravitablicu方法中没有正确实现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();
            }
        });
    }
}
…所以我必须使用经典的
语句

此外,我每次都尝试不创建
JTable
,我只是用
napraviablicu
方法创建模型,然后在构造函数中使用该模型,只需将其添加到表
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();
            }
        });
    }
}
公共类GUIBDelete扩展了JFrame{
私人喷丝头模型;
私人纺纱机;
私人JLabel LUnos;
比兹夫尔西的杰布顿·巴纳扎德私人酒店;
私有字符串ID,SqlQuery;
私有向量NaziviKolona=新向量();
私有向量Podaci=新向量();
私有JTable Tablica=新JTable();
私有JScrollPane滚动窗格;
私有模型;
私有无效的可剥夺的权利(){
试一试{
String SqlQuery=“从'nfc_baza'中选择*”;
Podaci.clear();
NaziviKolona.clear();
Class.forName(“com.mysql.jdbc.Driver”);
Connection con=DriverManager.getConnection(“jdbc:mysql://”
+“本地主机:3306/nfc”、“根目录”、“根目录”);
Statement Stat=con.createStatement();
ResultSet Rez=Stat.executeQuery(SqlQuery);
ResultSetMetaData md=Rez.getMetaData();
int columns=md.getColumnCount();

对于(inti=1;i您需要使用
com.mysql.jdbc.Driver
作为
jdbc
驱动程序,而不是通用的
jdbc/ODBC
驱动程序。此外,也不需要调用
fireTableDataChanged
,您的
TableModel
将在引擎罩下调用它


旁注:

  • 无需每次都创建
    JTable
    DefaultTableModel
    是一个可更新的可变
    TableModel
  • PreparedStatement
    被认为比
    Statement
  • 如果不添加新功能,则无需扩展
    JFrame
    。首选直接实例
  • 可维护性考虑将数据库/非UI代码与UI代码分开。
更新:

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

PreparedStatement Stat = con2.prepareStatement(SqlQuery);
然后,在执行查询时,有必要将
execute
语句与空一起使用 参数列表:

int rez = stat.executeUpdate();
最好将
语句
连接
关闭
语句放在
最后
块中。
Java使用一个小写字母作为变量名,这将使
SqlQuery
SqlQuery

您需要使用
com.mysql.jdbc.Driver
作为
jdbc
驱动程序,而不是通用的
jdbc/ODBC
驱动程序。此外,也不需要调用
fireTableDataChanged
,您的
表格模型将在引擎盖下调用此代码


旁注:

  • 无需每次都创建
    JTable
    DefaultTableModel
    是一个可更新的可变
    TableModel
  • PreparedStatement
    被认为比
    Statement
  • 如果不添加新功能,则无需扩展
    JFrame
    。首选直接实例
  • 可维护性考虑将数据库/非UI代码与UI代码分开。
更新:

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

PreparedStatement Stat = con2.prepareStatement(SqlQuery);
然后,在执行查询时,有必要将
execute
语句与空一起使用 参数列表:

int rez = stat.executeUpdate();
最好将
语句
连接
关闭
语句放在
最后
块中。
Java使用一个小写字母作为变量名,这将使
SqlQuery
SqlQuery

也无需重新创建表,只需更改表模型即可更新ui+1-此外,
SwingWorker
将有助于阻止ui“停止”当您从数据库获取值时…也不需要重新创建表,只需更改表模型即可更新ui+1-此外,
SwingWorker
将有助于阻止ui“停止”当您从数据库中获取值时……请学习java命名约定并坚持它们。请学习java命名约定并坚持它们。