从jtable中删除AbstractAction

时间:2011-12-24 22:31:23

标签: java swing jtable abstraction tablemodel

确定。我有一个大项目,在启动时创建一个特定的jtable,永远不会重建。刷新表模型,并根据各种用户操作重新绘制表。

我添加了一个自定义TableCellListener类来响应单元格更改以及AbstractAction。下面是第一次使用数据填充表时执行的代码。 (如果没有'firstLoad'检查,每次重绘表时都会附加多个动作。)

if(firstLoad) {
    AbstractAction action = new AbstractAction()
    {
        public void actionPerformed(ActionEvent e)
        {
            TableCellListener tcl = (TableCellListener)e.getSource();


                    sayIt("Row:" + tcl.getRow()+" Column:" + tcl.getColumn()+
                        " Old:" + tcl.getOldValue()+" New:" + tcl.getNewValue());

        }
    };

    firstLoad = false;
    TableCellListener tcl = new TableCellListener(table2, action);
}

TableCellListener是Rob Camick发布的here自定义侦听器,'sayIt'位是我自己的debuging代码。

这一切都很好但是我想在每次重建表时完全删除监听器并再次添加它,因为它“记住”了最后一个选定单元格的值,现在这个值无效,因为表格数据是新的。

我很确定'removePropertyChangeListener()'类型调用会这样做,但它希望将侦听器作为参数,我不知道如何找到它。

3 个答案:

答案 0 :(得分:4)

  

因为它“记住”了最后一个选定单元格的值,现在这个值无效,因为表格数据是新的。

开始编辑时应保存当前值,并在停止编辑时生成事件。更改TableModel时,不应编辑任何单元格。因此,当您生成下一个意味着您选择并开始在不同单元格上编辑的事件时,您应该拥有新模型的当前值。它适用于我:

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableCellListenerTest2
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI()
    {
        final JTable table = new JTable( TableCellListenerTest2.createModel());
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JScrollPane scrollPane = new JScrollPane(table);

        Action action = new AbstractAction()
        {
            public void actionPerformed(ActionEvent e)
            {
                TableCellListener tcl = (TableCellListener)e.getSource();
                System.out.println( tcl.getOldValue() + " : " + tcl.getNewValue() );
            }
        };

        TableCellListener tcl = new TableCellListener(table, action);

        JButton button = new JButton("Reset Model");
        button.addActionListener( new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                table.setModel( TableCellListenerTest2.createModel() );
            }
        });

        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("Table Cell Listener");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.add( scrollPane );
        frame.add(button, BorderLayout.SOUTH);
        frame.setSize(400, 160);
        frame.setLocationRelativeTo( null );
        frame.setVisible(true);
    }

    public static TableModel createModel()
    {
        Random random = new Random();

        DefaultTableModel model = new DefaultTableModel(10, 2);

        for (int i = 0; i < model.getRowCount(); i++)
            model.setValueAt("" + random.nextInt(100), i, 0);

        return model;
    }
}

如果您需要更多帮助,请发布您的SSCCE。

答案 1 :(得分:1)

为什么不简单地将TableCellListener,tcl作为类字段,并在重建模型时将其删除,然后重新构建监听器并重新添加它。

答案 2 :(得分:0)

只需记住实例变量中的TableCellListener实例:

// side effect: the tcl is added as PropertyChangeListener to the table 
// (bad design, IMHO)
this.tcl = new TableCellListener(table2, action);

// when the table data changes: 
if (this.tcl != null) {
    table2.removePropertyChangeListener(this.tcl);
}
this.tcl = new TableCellListener(table2, action);