首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >作为TableCellEditor在MouseDown上错误调用的JButton上的actionPerformed

作为TableCellEditor在MouseDown上错误调用的JButton上的actionPerformed
EN

Stack Overflow用户
提问于 2011-10-18 23:13:13
回答 1查看 1.2K关注 0票数 2

我正在尝试使用JButton作为TableCellRenderer,并将TableCellEditor用于我的JTable。在我的测试场景中,我有5行,每行显示一个JButton作为渲染器和编辑器(编辑器和渲染器的不同按钮实例)。当我第一次点击一个按钮时,当我释放鼠标按键时,编辑器按钮的actionPerformed就会被调用。然后,当我单击另一行中的另一个按钮时,当我按下鼠标键(MOUSE_PRESSED)时,编辑器按钮的actionPerformed-Event已经被调用。这种行为看起来不太对劲。通常,actionPerformed-event是在释放鼠标按钮时调用的,而不是在按下它时调用。随后在另一行中按下另一个按钮时,释放鼠标按键时,actionPerformed会再次正确调用;在另一行中单击下一个按钮时,在MOUSE_DOWN上再次(错误地)调用actionPerformed,依此类推。

将焦点移出表,然后单击某个按钮时,释放鼠标按键时会正确调用actionPerformed。此外,当要单击的按钮所在行中的表行编辑器首先被聚焦(激活),然后单击该按钮时,行为也是正确的。然后,唯一不起作用的情况是当表格单元格编辑器处于活动状态时,然后单击另一个表格行中的按钮。

比较两种情况下调用actionPerformed时的堆栈跟踪,我发现在不正确的情况下调用了DefaultKeyboardFocusManager(KeyboardFocusManager).redispatchEventBasicButtonListener.focusLost(FocusEvent),这两种情况在我看来都很可疑。

以下是针对我的问题的一小段演示代码:

代码语言:javascript
运行
复制
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractCellEditor;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;

public class TableButtonTest extends JFrame
{

    private JTable  table;

    public TableButtonTest()
    {
        super("TableButtonTest");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel(new GridLayout(1, 0));
        contentPane.setOpaque(true);
        setContentPane(contentPane);

        table = new JTable(new MyTableModel());
        table.setPreferredScrollableViewportSize(new Dimension(500, 70));
        add(table);

        setPreferredSize(new Dimension(600, 200));

        TableCellRenderer defaultBtnRenderer = new TableCellRenderer()
        {
            private JButton btn = new JButton("aa");

            public Component getTableCellRendererComponent(JTable _table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column)
            {
                return btn;
            }
        };

        table.getColumnModel().getColumn(0).setCellRenderer(defaultBtnRenderer);
        table.getColumnModel().getColumn(0).setCellEditor(new ButtonEditor());

        pack();
        setVisible(true);

    }

    public class ButtonEditor extends AbstractCellEditor implements TableCellEditor
    {
        private JButton btn = new JButton("bb");
        {
            btn.addActionListener(new ActionListener()
            {

                public void actionPerformed(ActionEvent e)
                {
                    System.out.println("BUTTON EVENT");
                }
            });
        }

        public Component getTableCellEditorComponent(JTable _table, Object value, boolean isSelected,
            int row, int column)
        {
            return btn;
        }

        public Object getCellEditorValue()
        {
            return null;
        }
    }

    class MyTableModel extends AbstractTableModel
    {
        public int getColumnCount()
        {
            return 1;
        }

        public int getRowCount()
        {
            return 5;
        }

        public Object getValueAt(int row, int col)
        {
            return null;
        }

        @Override
        public boolean isCellEditable(int row, int col)
        {
            return true;
        }
    }

    public static void main(String[] args)
    {
        new TableButtonTest();
    }
}

当您启动程序并按下任何"aa“按钮时,它将变为"bb”(表示显示编辑器而不是渲染器),当您松开鼠标按钮时,STDOUT上将打印"BUTTON EVENT“。如果您单击另一行中的另一个按钮,它也会变成"bb“,但在您松开鼠标按钮之前,"BUTTON EVENT”已经打印到STDOUT。此外,按钮文本周围的焦点矩形也不会显示。

我用Java、1.6.0_26和1.6.0_27测试了这种行为。当我使用1.5.0_17时,情况变得更糟:当单击第二个按钮时,没有调用actionPerformed,只显示了"bb"-button。第三次点击再次正常工作,第四次没有,以此类推。因此,与Java 1.6的区别在于,在1.6上的第二个版本(以及第四个版本...)单击actionPerformed是在释放鼠标按键时调用的,在1.5版本中根本不会调用。

但我不关心1.5,我只希望它能在1.6下工作。

我能做些什么来让它工作呢?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2011-10-19 00:03:00

Table Button Column展示了我使用按钮作为渲染器/编辑器的解决方案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7809556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档