简体   繁体   English

听jtable变化

[英]Listen jtable change

I have a problem with table model listener. 我对表模型侦听器有问题。 It doesn't work, and I don't know why. 它不起作用,我也不知道为什么。 I have tried different methods, and read a lot of questions here, but haven't found the solution. 我尝试了不同的方法,并在此处阅读了很多问题,但没有找到解决方案。 I've read this: Listening to JTable changes and this Row refreshing when cell is edited but it doesn't work. 我读过这篇文章: 侦听JTable发生变化,并且在编辑单元格时Row刷新,但是它不起作用。 I also have read this and this but result is the same. 我也看过这个这个 ,但结果是一样的。

Here is my code. 这是我的代码。 First of all definition of the table: 首先定义表:

private void prepareTable(JTable table, Map<String, String> tableData, int colsCount, int rowsCount, int nGram) {
        //Load data, set model, remove header
        NGramsTableModel nGramModel = new NGramsTableModel(tableData, allowedSymbols, colsCount, rowsCount, nGram);
        nGramModel.addTableModelListener(new NGramsTableListener());
        table.setModel(nGramModel);
        table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
        table.setTableHeader(null);

        //Set editor
        JTextField jtf = new JTextField();
        jtf.setDocument(new NGramsTableCellDocument(nGram));
        table.setDefaultEditor(String.class, new DefaultCellEditor(jtf));

        //Colorize rows
        for (int i = 0; i < table.getColumnModel().getColumnCount(); i++) {
            table.getColumnModel().getColumn(i).setCellRenderer(new NGramsTableCellRenderer());
        }
    }

Here is the model listener class: 这是模型侦听器类:

public class NGramsTableListener implements TableModelListener {

    @Override
    public void tableChanged(TableModelEvent e) {
        System.out.println("something changed...");
        System.out.println(e);
    }
}

And the table model class: 和表模型类:

public class NGramsTableModel extends AbstractTableModel implements TableModel {
    private Set<TableModelListener> listeners = new HashSet<TableModelListener>();
    ...
    ...
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        ...
        //it's OK, i see this message with entered symbols
        System.out.println("setValueAt: " + aValue);
        //I tried use every of this, but it doesn't work. A don't see any massage from NGramsTableListener class
        fireTableCellUpdated(rowIndex, columnIndex);
        fireTableDataChanged();
        fireTableRowsInserted(rowIndex, columnIndex);
        fireTableRowsUpdated(rowIndex, columnIndex);
    }

    @Override
    public void addTableModelListener(TableModelListener l) {
        listeners.add(l);
    }

    @Override
    public void removeTableModelListener(TableModelListener l) {
        listeners.remove(l);
    }
 }

Actually I need to get updated object with coords(rowIndex, colIndex) , because later I want get updated object and object with coords(rowIndex-1, colIndex) if exists. 实际上,我需要获取带有coords(rowIndex, colIndex)更新对象,因为稍后我想获取带有coords(rowIndex-1, colIndex)更新对象和对象coords(rowIndex-1, colIndex)如果存在)。

Where is my mistake? 我的错误在哪里?

Thanks 谢谢

The AbstractTableModel already implements the table model listener methods. AbstractTableModel已经实现了表模型侦听器方法。 That is the benefit of extending AbstractTableModel. 那就是扩展AbstractTableModel的好处。 The solution to your problem is to get rid of all that code. 解决您的问题的方法是摆脱所有这些代码。

When you extend AbstractTableModel you are responsible for implementing the other methods of TableModel, like getColumnClass(), getValueAt(...), setValueAt(...) etc. 扩展AbstractTableModel时,您负责实现TableModel的其他方法,例如getColumnClass(),getValueAt(...),setValueAt(...)等。

You need to provide a method which will fireXXX notified all registered listeners for example: 您需要提供一种方法,该方法将触发XXX通知所有注册的侦听器,例如:

public class NGramsTableModel extends AbstractTableModel implements TableModel {
private LinkedList<TableModelListener> listeners = new LinkedList<TableModelListener>();
...
...
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    ...
    //it's OK, i see this message with entered symbols
    System.out.println("setValueAt: " + aValue);
    //Use your fireXXX method
    fireNGramTableChanged();
}

@Override
public void addTableModelListener(TableModelListener l) {
    listeners.add(l);
}

@Override
public void removeTableModelListener(TableModelListener l) {
    listeners.remove(l);
}

protected void fireNGramTableChanged(){
   for(TableModelListener next : listeners){
     next.tableChanged(new TableModelEvent());
   }
}

} }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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