【问题标题】:Listen jtable change监听 jtable 变化
【发布时间】:2015-05-05 23:15:04
【问题描述】:

我对表模型侦听器有疑问。它不起作用,我不知道为什么。我尝试了不同的方法,并在这里阅读了很多问题,但还没有找到解决方案。 我读过这个:Listening to JTable changes 和这个Row refreshing when cell is edited 但它不起作用。 我也读过thisthis 但结果是一样的。

这是我的代码。首先定义表:

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());
        }
    }

这里是模型监听类:

public class NGramsTableListener implements TableModelListener {

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

以及表模型类:

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);
    }
 }

实际上我需要使用coords(rowIndex, colIndex) 获取更新的对象,因为稍后我想使用coords(rowIndex-1, colIndex) 获取更新的对象和对象(如果存在)。

我的错误在哪里?

谢谢

【问题讨论】:

    标签: java swing jtable tablemodel


    【解决方案1】:

    AbstractTableModel 已经实现了表模型侦听器方法。这就是扩展 AbstractTableModel 的好处。您的问题的解决方案是摆脱所有这些代码。

    当你扩展 AbstractTableModel 时,你负责实现 TableModel 的其他方法,如 getColumnClass()、getValueAt(...)、setValueAt(...) 等。

    【讨论】:

    • 什么例子?您只需从与 TableModelListener 相关的类中删除代码。所以基本上你发布的代码去掉了除了setValueAt(...)方法之外的所有方法。
    • 我删除了与侦听器和“实现 tableModel”相关的所有内容,现在它可以正常工作,无需任何其他方法。
    • @Alex,所以如果这是正确的解决方案,你应该“接受”这个答案,这样阅读这个问题的人就不会对使用哪种解决方案感到困惑。
    【解决方案2】:

    您需要提供一个方法,该方法将 fireXXX 通知所有已注册的侦听器,例如:

    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());
       }
    }
    

    }

    【讨论】:

    • 太棒了!它有效,谢谢!但为什么会这样?我只添加了 1 个侦听器。 TableModel 不知道是哪一个?
    • 无需实现表模型监听器代码,AbstractTableModel 为您完成。这就是扩展 AbstractTableModel 的好处。
    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 2013-04-01
    • 2013-01-05
    • 1970-01-01
    • 2011-11-27
    • 2023-04-07
    相关资源
    最近更新 更多