[英]Can't seem to get the TableModelListener to work
我正在創建一個UI類,其中所有內容都將運行(另一個類將作為運行器)。 在這個類中,我有一個表,並且該表應該在更改時創建TableModeEvents,但它似乎沒有這樣做。
每當我對桌子做任何事情時,控制台都會打印出“測試”,但事實並非如此。 我已經制作了其他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);
}
}
當您更改任何表格單元格的值時,將調用setValueAt
方法,但不會觸發任何事件。
嘗試將fireTableCellUpdated(row, column)
方法調用添加到setValueAt
方法,如下所示:
public void setValueAt(Object value, int row, int column) {
rowData[row][column] = value;
fireTableCellUpdated(row, column);
}
請注意,您也可以使用fireTableDataChanged()
,但這將觸發最常見的事件,並建議您觸發最具體的事件,因為它可以避免不必要的工作並且能夠維持選擇狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.