【发布时间】:2012-04-23 11:48:11
【问题描述】:
我只想在JTree 节点的右键单击上显示弹出框,而不是整个JTree 组件。
当用户右键单击 JTree 节点时,会出现弹出框。如果他右键单击JTree 中的空白区域,那么它不应该出现。因此,我如何才能仅检测 JTree 节点的鼠标事件。我在网上搜索了很多次,但没有找到解决方案,请帮助我。
谢谢。
【问题讨论】:
标签: java swing jtree jpopupmenu
我只想在JTree 节点的右键单击上显示弹出框,而不是整个JTree 组件。
当用户右键单击 JTree 节点时,会出现弹出框。如果他右键单击JTree 中的空白区域,那么它不应该出现。因此,我如何才能仅检测 JTree 节点的鼠标事件。我在网上搜索了很多次,但没有找到解决方案,请帮助我。
谢谢。
【问题讨论】:
标签: java swing jtree jpopupmenu
这是一个简单的方法:
public static void main ( String[] args )
{
JFrame frame = new JFrame ();
final JTree tree = new JTree ();
tree.addMouseListener ( new MouseAdapter ()
{
public void mousePressed ( MouseEvent e )
{
if ( SwingUtilities.isRightMouseButton ( e ) )
{
TreePath path = tree.getPathForLocation ( e.getX (), e.getY () );
Rectangle pathBounds = tree.getUI ().getPathBounds ( tree, path );
if ( pathBounds != null && pathBounds.contains ( e.getX (), e.getY () ) )
{
JPopupMenu menu = new JPopupMenu ();
menu.add ( new JMenuItem ( "Test" ) );
menu.show ( tree, pathBounds.x, pathBounds.y + pathBounds.height );
}
}
}
} );
frame.add ( tree );
frame.pack ();
frame.setLocationRelativeTo ( null );
frame.setVisible ( true );
}
【讨论】:
MouseEvent#isPopupTrigger,然后使用isRightMouseButton 方法。
JTree 了解这么多 :-) 。对我来说这是一个很好的答案:-)
只是因为我最近偶然发现了这个,我认为它比现有的答案要容易一些:
public static void main(String[] args) {
JFrame frame = new JFrame();
final JTree tree = new JTree();
JPopupMenu menu = new JPopupMenu();
menu.add(new JMenuItem("Test"));
tree.setComponentPopupMenu(menu);
frame.add(tree);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
【讨论】:
event.isPopupTrigger(),除其他可能的问题外,这在某些系统上不起作用。