2013-03-01 62 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