JPopup键绑定只能工作一次

时间:2013-11-08 15:28:59

标签: java swing jpopupmenu

我创建了一个静态JPopupMenu,并将键绑定分配给使用:

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

通过执行以下操作,JPopupMenu已添加到JTable

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

我还在MouseListener添加JTable以触发弹出菜单:

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

但是通过这样做,虽然菜单会显示快捷方式永远不会工作,除非popupmenu可见。

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

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

谢谢。

1 个答案:

答案 0 :(得分:3)

  

但是通过这样做,虽然菜单会显示快捷方式永远不会工作,除非popupmenu可见。

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

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

或者另一种方法是为所有加速器手动添加Key Bindings。这是实现JTable的所有默认操作的方式。