2011-10-04 85 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:不客气!一个简单的修复呢! –

相关问题