簡體   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