我创建了一个静态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
一起工作后,我现在希望能够找到为什么快捷方式仅在显示菜单之前(和期间)工作。即使我没有点击弹出菜单中的某个项目,在隐藏菜单后,快捷方式也不起作用。
谢谢。
答案 0 :(得分:3)
但是通过这样做,虽然菜单会显示快捷方式永远不会工作,除非popupmenu可见。
这是正确的行为。加速器应仅在组件可见时才起作用。因此,除非弹出窗口可见,否则加速器将无法工作。
如果您希望加速器一直工作,那么您应该使用带有JMenus的JMenuBar和包含加速器的JMenuItems。我喜欢这种方法,因为如果为每个加速器提供了自我文档。
或者另一种方法是为所有加速器手动添加Key Bindings。这是实现JTable的所有默认操作的方式。