繁体   English   中英

似乎无法使TableModelListener工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM