2013-03-01 63 views
0

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

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(); 
      } 
     }); 
    } 
} 
+0

请学习java命名约定并坚持使用它们。 – kleopatra 2013-03-02 14:29:05

回答

3

您需要使用com.mysql.jdbc.Driver为您JDBC驱动程序,而不是一般的JDBC/ODBC之一。也没有必要致电fireTableDataChanged,您的TableModel将在此引用。


旁注:

  • 无需创建每次JTableDefaultTableModel是可更新的TableModel
  • PreparedStatement被认为是较安全Statement
  • 没有必要延长JFrame,如果你不增加新的功能。直接实例是首选。
  • 为了可维护性,考虑将数据库/非UI代码与UI代码分开。

更新:

要创建一个PreparedStatement,使用Connection#prepareStatement而非Connection#createStatement

PreparedStatement Stat = con2.prepareStatement(SqlQuery); 

然后执行查询时,有必要使用execute声明与 参数列表:

int rez = stat.executeUpdate(); 

而且最好将Statement & Connection & close报表一个finally块。 Java使用初始的小写字母字母表示变量名称,这将使SqlQuerysqlQuery

+2

也不需要重新创建表格,只需更改表格模型就可以更新ui + 1 - 此外,当您从数据库获取值时,“SwingWorker”将有助于阻止用户界面“停止”... – MadProgrammer 2013-03-01 02:07:00