2012-03-20 95 views
1

爲什麼不將表格單元格0,1從aaa更改爲XXXX?JTable將不會刷新

import java.awt.*; 

import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 


class MainFrame { 

    public static void main(String[] args) { 


     JFrame f = new JFrame("Refreshing JTable"); 
     JPanel p = new JPanel(new GridBagLayout()); 
     DefaultTableModel productsModel; 
     JTable productsTable; 

     f.setSize(800, 600); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     String[] tableTitle = new String[] {"ID", "Name"}; 
     String[][] tableData = {{"1", "AAA"},{"2", "BBB"}}; 


     productsModel = new DefaultTableModel(tableData, tableTitle); 
     productsTable = new JTable(productsModel) { 
      public boolean isCellEditable(int r, int c) { 
       return false; 
      } 
     }; 

     JScrollPane scrollpane = new JScrollPane(productsTable); 


     tableData[0][1] = "XXXX"; 

     f.add(p); 
     p.add(scrollpane); 
     f.validate(); 
     f.setVisible(true); 


    } 


} 

原因: 顯然試圖更新數據存儲位置將導致JTable中不改變陣列。無論是DefaultTableModel需要更新或整個表需要重繪。

編輯(可能的解決方案)的一種方法是使用定時器

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 
import javax.swing.table.DefaultTableModel; 

class MainFrame { 

    static JFrame f = new JFrame("Refreshing JTable"); 
    static JPanel p = new JPanel(new GridBagLayout()); 
    static DefaultTableModel productsModel; 
    static JTable productsTable; 

    public static void main(String[] args) { 
     runGui(); 
    } 

    @SuppressWarnings("serial") 
    public static void runGui() { 

     f.setSize(800, 600); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


     String[] tableTitle = new String[] {"ID", "Name"}; 
     String[][] tableData = {{"1", "AAA"},{"2", "BBB"}}; 


     productsModel = new DefaultTableModel(tableData, tableTitle); 
     productsTable = new JTable(productsModel) { 
      public boolean isCellEditable(int r, int c) { 
       return false; 
      } 
     }; 

     JScrollPane scrollpane = new JScrollPane(productsTable); 


     tableData[0][1] = "XXXX"; 

     Timer t = new Timer(2000, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       addColumns(); 
       remakeData(); 
       productsTable.setModel(productsModel); 

      } 
     }); 
     t.start(); 

     f.add(p); 
     p.add(scrollpane); 
     f.validate(); 
     f.setVisible(true); 


    } 

    private static void addColumns() { 
     productsModel.setColumnCount(0); 
     productsModel.addColumn("ID"); 
     productsModel.addColumn("Name"); 
    } 

    private static void remakeData() { 
     productsModel.setRowCount(0); 
     productsModel.insertRow(productsModel.getRowCount(), new Object[] {"1", "Dummy item 1"}); 
     productsModel.insertRow(productsModel.getRowCount(), new Object[] {"2", "Dummy itme 2"}); 
     productsModel.insertRow(productsModel.getRowCount(), new Object[] {"3", "Dummy item 3"}); 
     productsModel.insertRow(productsModel.getRowCount(), new Object[] {"4", "Dummy item 4"}); 
     productsModel.insertRow(productsModel.getRowCount(), new Object[] {"5", "Dummy item 5"}); 
    } 
} 

EDIT(更好的解決方案,它完美地爲我工作的方式)使用靜態方法。由於我通過另一個Frame在數組中添加新數據,因此我在MainFrame中創建了一個靜態方法,每當我在數組中添加/更新/刪除Object時,都會調用它。此方法將在更新後重新創建整個模型,並因此將刷新表格。

+5

爲了更快提供更好的幫助,請發佈[SSCCE](http://sscce.org/)。 – 2012-03-20 18:59:53

+1

我第二次是Andrew的偉大建議,因爲我認爲根據目前的信息我們無法猜測出現了什麼問題。還可以考慮使用豐盛的System.out.println調用來爲代碼添加代碼,以幫助調試錯誤源並確保您的假設都是正確的。 – 2012-03-20 19:12:28

+0

可能重複的[Java,如何刷新JTable](http://stackoverflow.com/questions/9790883/java-how-to-refres-jtable) – kleopatra 2012-03-20 19:14:00

回答

3

SSCCE發佈在您的相關線程上的一個問題是,代碼更改最初形成表模型的數組,而它應該更改表模型本身。

+0

事情是,表格顯示了我存儲在數組中的sql查詢的數據。另外,當我添加產品時,我將它添加到數據庫中,而不僅僅是tablemodel。我怎麼才能從sql中檢索數據並將其直接存儲在模型中? – vedran 2012-03-21 07:47:39

+0

*「事情是,表格顯示了我在數組中存儲的來自sql查詢的數據。」*那麼...什麼?你期望當本地數組被更改時更新數據庫嗎?我很困惑,或者你是,或者我們都是。 – 2012-03-21 07:51:53

+0

也許你:)畢竟我是這裏的新手。至於這個問題,相當糟糕的一個:有沒有一種解決方案可以幫我更新表模型,每次我通過查詢添加一些東西? – vedran 2012-03-21 07:55:21

3

解決您的問題(前一個)是相當簡單的,但不幸的是有點太長時間將它張貼在評論

  1. 你要確保你做一個JTable如何實際工作一些閱讀。一個好的起點是Swing tutorial,甚至可能是最重要的類別JTableTableModel的javadoc。關於Swing和使用MVC的另一個好消息是this document。它比只有JTable s更廣泛,但會爲您提供有關所有Swing組件的設計方式以及如何使用它們的更多信息。
  2. 閱讀完本教程後,您應該瞭解如果要更新表中顯示的數據,請更新表格的模型。該模型將觸發由表接收的事件,並且該表將確保它自己更新。畢竟,表格只是數據的一個視圖(= TableModel),因此更新應在模型上進行。如果不清楚,請返回步驟1
  3. 現在,查看您的代碼並刪除偵聽器。相反,更新表格上的模型並查看錶格如何自我更新。
  4. 如果這不起作用,你回到這個網站與您發佈的SSCCE。這樣我們就可以看到你嘗試了一些東西,你嘗試了什麼,並且很可能在代碼中出了什麼問題。此SSCCE應包含您使用的TableModel的代碼以及更新您的TableModel的代碼,因爲這是您問題的最可能位置。
+1

+1另請參閱更新的問題(現在使用SSCCE!)。 – 2012-03-21 07:50:09

+0

很好的答案,按照這個,你不會出錯 – 2012-03-21 08:32:30

+0

嗨,謝謝你的答案。感謝安德魯我發現了這個問題。這似乎是我將新數據添加到數組中,我將它用作模型的數據容器,它不會執行任何操作。相反,我正在尋找一種解決方案,可以讓我不斷更新表格模型。現在我已經通過一個調用remakeTable()方法的計時器找到了一個解決方案,該方法完全刪除了模型數據,然後用新的sql querry替換它。 – vedran 2012-03-21 08:43:00