2013-10-22 84 views
-1

我看到的使用刷新JTable中相當多的線程:刷新JTable中的所有數據

String[] columnNames = {"column1","column2,......,"columnN"}; 
String[][] tableData = new String[1][columnNames.length]; 
JTable table = new JTable(tableData,columnNames); 

JScrollPane scrollpane = new JScrollPane(table); 
contentPane.add(scrollpane); 

......做出改變存儲在tableData然後調用數據...

AbstractTableModel model = (AbstractTableModel) table.getModel(); 
model.fireTableDataChanged(); 

但這似乎並沒有改變我的任何東西。我需要最初顯示一行空白表格,然後在用戶加載數據文件時更新它,但下面的代碼似乎不適用於我。我假設它是因爲即時重新定義tableData,但是這必須完成,因爲我不知道在用戶加載文件之前要顯示多少行數據。我如何更新表格?


編輯: 這樣可以很清楚我運行的代碼是:

//Initialize Table With 1 Blank Row 
String[] columnNames = {"column1","column2,......,"columnN"}; 
String[][] tableData = new String[1][columnNames.length]; 
JTable table = new JTable(tableData,columnNames); 

JScrollPane scrollpane = new JScrollPane(table); 
contentPane.add(scrollpane); 

//When the file is loaded resize tableData so it can fit all the file data 
tableData = new String[length of data file][columnNames.length]; 

//Update some of the tableData points 
tableData[0][0]="data 1"; 
tableData[1][0]="data 2"; 
tableData[0][1]="data 3"; 
tableData[1][1]="data 4"; 
....etc 

//Tell the JTable to update 
AbstractTableModel model = (AbstractTableModel) table.getModel(); 
model.fireTableDataChanged(); 
+0

將代碼發佈到更新表模型的位置。 – Makky

+0

@Makky我發佈了更新tableData的代碼。然後我調用model.fireTableDataChanged(),但沒有任何變化。 – Edd

+0

你不應該直接調用fireXXX方法。這是TableModel的責任。 – camickr

回答

3

我認爲這個問題是當你創建你並沒有使用任何模型,它的JTable。

見下面的例子:

它在這裏太多了,但你會得到的想法。

import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.table.DefaultTableModel; 
import javax.swing.table.TableModel; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 

public class TestGUI { 

    private JFrame frame; 
    private JTable table; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        TestGUI window = new TestGUI(); 
        window.frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the application. 
    */ 
    public TestGUI() { 
     initialize(); 
    } 

    /** 
    * Initialize the contents of the frame. 
    */ 
    private void initialize() { 
     frame = new JFrame(); 
     frame.setBounds(100, 100, 450, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setBounds(60, 81, 311, 96); 

     frame.getContentPane().add(scrollPane); 

     String[] columnNames = { "column1", "column2", "columnN" }; 
     String[][] tableData = new String[1][columnNames.length]; 
     table = new JTable(tableData, columnNames); 
     DefaultTableModel model = new DefaultTableModel(2, columnNames.length); 
     model.addRow(new String[] { "A", "B", "C" }); 
     table.setModel(model); 

     scrollPane.setViewportView(table); 

     JButton btnNewButton = new JButton("update"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       DefaultTableModel model = (DefaultTableModel) table.getModel(); 
       model.addRow(new String[] { "A", "B", "D" }); 

      } 
     }); 
     btnNewButton.setBounds(49, 199, 89, 23); 
     frame.getContentPane().add(btnNewButton); 
    } 
} 
+0

有沒有辦法可以完全覆蓋舊的tableModel?說如果我加載一個文件,然後加載另一個完全不同的數據我需要調整大小和完全重置表。單獨刪除每行然後添加一個新行似乎效率不高。 – Edd

+0

用您的數據創建一個新的TableModel,然後使用'table.setModel(...)'方法。 – camickr

2

你的榜樣永遠不會工作,因爲DefaultTableModel(這是默認這裏使用),將您的所有陣列的數據複製到內部矢量對象。所以原始數組中的更改將永遠不會傳播到DefaultTableModel的內部結構。

直接使用DefaultTableModel可以避免您的問題。