Не могу заставить TableModelListener работать - PullRequest
4 голосов
/ 04 октября 2011

Я создаю класс пользовательского интерфейса, в котором все будет работать (другой класс будет работать в качестве бегуна). В этом классе у меня есть таблица, и таблица должна создавать TableModeEvents при изменении, но, похоже, она этого не делает.

Консоль должна выводить «test» всякий раз, когда я что-то делаю с таблицей, но это не так. Я сделал другие 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 Ответ

12 голосов
/ 04 октября 2011

При изменении значения любой из ячеек таблицы вызывается метод setValueAt, но событие не запускается.

Попробуйте добавить вызов метода fireTableCellUpdated(row, column) к вашему методу setValueAt, например:

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

Обратите внимание, что вы также можете fireTableDataChanged(), но это вызовет самое общее событие, и рекомендуется, чтобы вы запускали самое конкретное, так как это исключает ненужную работу и способно поддерживать состояние выбора.

...