2011-10-04 120 views
4

我正在創建一個UI類,其中一切都將運行(不同的類將作爲跑步者)。在這個類中,我有一個表格,表格應該在更改時創建TableModeEvents,但似乎沒有這樣做。似乎無法讓TableModelListener正常工作

控制檯應該打印出「測試」,只要我對錶做任何事情,但事實並非如此。我做了其他的SSCCE,只要我把所有東西放在一個程序中(在主要方法中,只有子類和匿名類),但它們工作得很好,但我似乎無法讓它在類中工作。

任何想法我做錯了什麼?

package SSCCE; 

import java.awt.BorderLayout; 

import javax.swing.*; 
import javax.swing.event.TableModelEvent; 
import javax.swing.event.TableModelListener; 
import javax.swing.table.AbstractTableModel; 
import javax.swing.table.TableModel; 

public class SSCCE { 

static Object[][] data = { {"Abyss", Boolean.FALSE},{"Scepter", Boolean.FALSE},{"FoN", Boolean.FALSE} }; 
public static void main(String[] args){ 

    //table model------------------------------------------ 
    TableModel model = new AbstractTableModel(){ 
     Object[][] rowData = { {"Abyss", Boolean.FALSE},{"Scepter", Boolean.FALSE},{"FoN", Boolean.FALSE} }; 
     String[] columnNames = {"Name","Boolean"}; 

     public int getColumnCount() {return columnNames.length;} 

      public String getColumnName(int column) {return columnNames[column];} 

      public int getRowCount() {return rowData.length;} 

      public Object getValueAt(int row, int column) {return rowData[row][column];} 

      public Class getColumnClass(int column) {return (getValueAt(0, column).getClass());} 

      public void setValueAt(Object value, int row, int column) {rowData[row][column] = value;} 

      public boolean isCellEditable(int row, int column) {return (true);} 
    }; 


    JTable table = new JTable(model); 
    //tableChanged------------------------------------------ 
    model.addTableModelListener(new TableModelListener(){ 
     public void tableChanged(TableModelEvent e) { 
      System.out.println("test"); 
     } 

    }); 

    //frame stuff, ignore----------------------------------- 
    JFrame frame = new JFrame(); 
    frame.setLayout(new BorderLayout()); 
    frame.add(table,BorderLayout.CENTER); 
    frame.setSize(500,400); 
    frame.setLocation(400,200); 
    frame.setDefaultCloseOperation(3); 
    frame.setVisible(true); 

} 

} 
+1

我不認爲有任何的方式來告訴你根據到目前爲止你已經發布的代碼和文本做錯了什麼。考慮創建併發佈一個顯示你的問題的[SSCCE](http://SSCCE.org),並確保使用多個類(但將它們放在一個文件中),你可能會在這裏獲得更好的結果。 –

+0

@Hovercraft Full Of Eels +1指出一個源文件可以包含多個類。引用SSCCE文件的['Correct'部分](http://pscode.org/sscce.html#co)。 *「如果語言只爲每個源代碼文件指定一個公共類,則將所有其他類降級爲默認值,這樣就可以在不分割成單獨文件的情況下編譯該示例。」* –

+0

好了,添加了一個SSCCE。謝謝你讓我知道。 – Nacht

回答

12

當你改變任何表格單元格的值時,setValueAt方法被調用,但沒有被解僱的事件。

嘗試添加fireTableCellUpdated(row, column)方法調用你的setValueAt方法,像這樣:

public void setValueAt(Object value, int row, int column) { 
    rowData[row][column] = value; 
    fireTableCellUpdated(row, column); 
} 

請注意,您也可以fireTableDataChanged(),但將火最一般的情況下,它的建議是你火的最具體的因爲它避免了不必要的工作,並且能夠保持選擇狀態。

+0

非常感謝!!!!!!!!!!!!這件事已經殺了我好幾天了! – Nacht

+0

+1與模型一起工作。 – trashgod

+0

@Nacht:不客氣!一個簡單的修復呢! –

相關問題