2016-03-04 26 views
0

所以我有兩種方法method_1method_2。這兩種方法都是相同的,只是中的一個小變化,用於循環。在點擊一個按鈕的事件,method_1得到執行,我得到的數據按照預期的JTable,類似地,當點擊第二個按鈕,method_2得到執行,我得到的結果,但是當我把鼠標懸停在表頭,前面的列名稱顯示並單擊行或滾動時,先前的數據將被覆蓋。JTable顯示關於懸停/點擊/滾動新數據的以前的數據

JScrollPane scrollPane_2; 
DefaultTableModel model; 
JTable table; 

public void method_1(){ 
    String[][] data = new String[10][4]; 
    for(int i=0;i<10;i++) 
     for(int j=0; j<4; j++) 
      data[i][j] = "one"; 

    String[] column = { "Column_1", "Column_2", "Column_3", "Column_4"}; 
    model = new DefaultTableModel(data, column); 
    table = new JTable(model); 
    scrollPane_2 = new JScrollPane(table); 
    panel_6.add(scrollPane_2); 
    panel_6.revalidate(); 
} 

public void method_2(){ 
    String[][] data = new String[8][2]; 
    for(int i=0;i<8;i++) 
     for(int j=0; j<2; j++) 
      data[i][j] = "Row_"+i; 

    String[] column = { "Column_1", "Column_2"}; 
    model = new DefaultTableModel(data, column); 
    model.fireTableDataChanged(); 
    table = new JTable(model); 
    scrollPane_2 = new JScrollPane(table); 
    panel_6.add(scrollPane_2, BorderLayout.CENTER); 
    panel_6.revalidate(); 
} 

嘗試重新驗證()和重繪()上scollPane和麪板,也fireTableDataChanged()上的DefaultTableModel,沒有任何成功

回答

3
panel_6.add(scrollPane_2, BorderLayout.CENTER); 

添加其他組件到中心不刪除以前的組件這是添加到中心。 Swing默認繪畫將以與添加到容器相反的順序繪製組件。因此,兩個組件都可以被繪製,但你會看到最後一個繪製的。然而,這可能會導致事件被分派到不同的組件導致繪畫問題的問題。

不要將創造新的JTable和JScrollPane的組件。

相反,當你想改變在表中的數據,所有你需要做的是改變現有的JTable的模型。所以你需要的是:

table.setModel(theNewModel); 

沒有必要觸發事件或重新驗證()或任何東西。

+0

該訣竅...創造新的JTable和JScrollPane的是給這個問題。 – Jerry