2013-03-01 60 views
0

這是一個JDBC項目。來自WAMP服務器上的MySQL數據庫的數據顯示在JTable中。我想在我的JSpinner上輸入一個用戶輸入的ID,從表中刪除具有該ID的行。我做了一個SQL查詢並且一切正常,但當我的查詢執行時,我的JTable上的數據不會刷新。我點擊我的JNazad按鈕(我的後退按鈕),然後重新進入該窗口,以便我的JTable顯示刷新的數據。我在我的NapraviTablicu方法中沒有執行FireTableModel,因爲它的DefaultTableModel和更新會自動完成。我不知道我做錯了什麼:執行我的數據庫查詢時,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("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(); 
      } 
     }); 
    } 
} 

回答

1

它看起來像你刪除從數據庫表中的一行,並且希望JTable以反映更改。在izvrsiQuery()更新您的TableModelJTable將自行更新。例如,

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

注意,行號在0開始,他們必須使用RowSorter當翻譯。

順便說一句,如果您使用常見的Java命名約定和因子常量,您的代碼將更容易讓其他人閱讀。

附錄:該示例僅刪除一行數字。您必須搜索TableModel以查找與刪除的ID對應的行。

附錄:儘管不太實際,但您可能需要在使用setModel()進行DML操作後刷新數據庫中的整個表格,如here所示。

+0

對不起,但你不明白我。當JSpinner更改值時,我不希望我的表數據發生更改。我希望當我的查詢執行時,我的jtable會更改數據,當用戶輸入他想要在Jspinner上刪除的行的ID時,會發生這種情況,之後他點擊Jbutton「Izvrsi」(我的查詢被執行),那麼Jtable必須更改data ... – 2013-03-01 19:58:06

+0

好的,改變'napraviTablicu()'返回一個'TableModel'並且執行'tablica.setModel()'來刷新表格,如下所示[here](http://stackoverflow.com/a/8260663/230513)。 – trashgod 2013-03-02 00:05:11