gpt4 book ai didi

java - 从 jtable 中删除 AbstractAction

转载 作者:行者123 更新时间:2023-11-29 08:10:09 25 4
gpt4 key购买 nike

好的。我有一个大型项目,其中一个特定的 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 是发布的自定义监听器 here由 Rob Camick 编写,'sayIt' 位是我自己的调试代码。

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

我相当确定“removePropertyChangeListener()”类型的调用可以做到这一点,但它需要将监听器作为参数,但我不确定如何找到它。

最佳答案

because it is 'remembering' the value from the last selected cell, which is now not valid because the table data is new.

开始编辑时保存当前值,停止编辑时生成事件。当您更改 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。

关于java - 从 jtable 中删除 AbstractAction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8627213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com