0

我有一个静态JPopupMenu,我创建并分配键绑定以使用:

JMenuItem mItem = new MenuItem( "name" );
mItem.setAccelerator( KeyStroke.getKeyStroke( KeyEvent.VK_W, ActionEvent.CTRL_MASK ) );

通过执行以下JPopupMenu操作将其添加到 a :JTable

JTable table = new JTable();
table.add( popupMenu );

我还添加了一个MouseListenerJTable触发弹出菜单:

table.addMouseListener( mListener );

我重写mouseReleased( MouseEvent me )以通过以下方式添加用于显示弹出菜单的操作:

private void checkPopupTrigger( MouseEvent me )
        {
            if ( me.isPopupTrigger() )
            {
                JTable source = (JTable)me.getSource();
                int row = source.rowAtPoint( me.getPoint() );
                int column = source.columnAtPoint( me.getPoint() );

                if (! source.isRowSelected(row))
                    source.changeSelection(row, column, false, false);

                popupMenu.show( me.getComponent(), me.getX(), me.getY() );
            }

        }

我遇到的问题是,在第一次加载快捷方式时可以正常工作,它可以在没有打开 JPopupMenu 的情况下工作,因此如果您已经知道要按下的快捷方式,则无需右键单击并显示菜单。如果我右键单击并显示弹出菜单,则一旦弹出菜单不可见,快照将不再起作用。

如果我检查我的JTable实例(在 Eclipse IDE 中),它实际上似乎在JPopupMenu调用以下行后组件已从表中删除:

popupMenu.show( me.getComponent(), me.getX(), me.getY() );

这种行为有原因吗?在各种不同的方法之后,我似乎无法找出发生了什么。我也尝试过使用:

table.setComponentPopupMenu(myPopupMenu);

但是通过执行上述操作,尽管菜单将显示快捷方式,但除非弹出菜单可见,否则这些快捷方式永远不会起作用。

如果这可能与分配的键绑定有任何关系,我正在 Windows 8 上运行。

非常感谢任何帮助,我确实在 和 上使用了单独KeyListenerJTableJPopupMenu但这意味着分配所有快捷方式两次,一次在弹出窗口上,一次在单独的KeyListener. 在让它与它一起工作之后,JPopupMenu我现在希望能够找出为什么快捷方式只在显示菜单之前(和期间)工作。即使我不单击弹出菜单中的项目,快捷方式在菜单隐藏后也将不起作用。

谢谢你。

4

1 回答 1

3

但是通过执行上述操作,尽管菜单将显示快捷方式,但除非弹出菜单可见,否则这些快捷方式永远不会起作用。

这是正确的行为。加速器应该只在组件可见时才起作用。因此,除非弹出窗口可见,否则加速器将不起作用。

如果您希望加速器一直工作,那么您应该使用带有 JMenuBar 和包含加速器的 JMenuItems 的 JMenuBar。我喜欢这种方法,因为如果为每个加速器提供自我文档。

或者另一种方法是为所有加速器手动添加键绑定。这是JTable所有默认Action的实现方式。

于 2013-11-08T16:21:35.807 回答