我有一个静态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 );我还向JTable添加了一个MouseListener,以触发弹出菜单:
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);但是,通过以上操作,尽管菜单将显示快捷方式,但除非弹出菜单可见,否则这些快捷方式永远不会起作用。
我在Windows8上运行,如果这可能与分配的键绑定相关。
任何帮助都是非常感谢的,我确实在JTable和JPopupMenu上使用了一个单独的KeyListener来工作,但这意味着分配所有的快捷键两次,一次在弹出窗口上,另一次用于单独的KeyListener。在让它只与JPopupMenu一起工作之后,我现在希望能够找出为什么快捷键只能在菜单显示之前(和期间)工作。即使我没有点击弹出菜单中的项目,在菜单被隐藏后,快捷方式也不会起作用。
谢谢。
发布于 2013-11-09 00:21:36
但通过执行上述操作,尽管菜单将显示快捷方式,但除非弹出菜单可见,否则这些快捷方式永远不会起作用。
这是正确的行为。只有当组件可见时,加速器才能工作。因此,除非弹出窗口可见,否则加速器将无法工作。
如果您希望加速器始终工作,那么您应该使用包含加速器的JMenus和JMenuItems的JMenuBar。我喜欢这种方法,因为如果为每个加速器提供了自己的文档。
或者,另一种方法是为所有加速器手动添加Key Bindings。这是实现JTable的所有默认操作的方式。
https://stackoverflow.com/questions/19862673
复制相似问题