右键单击Java中的Swing节点添加JPopup菜单
在GUI中,我在JPanel
的左侧显示一个JTree
。现在对于每个Node(leaf)
,在鼠标右键单击上,我想要显示JPopup
菜单,要求在右边的JPanel
中显示有关Node
的统计信息。右键单击Java中的Swing节点添加JPopup菜单
由于我是新的摆动,任何人都可以帮助代码。 在此先感谢。
Regards, Tushar Dodia。
使用的JTree的方法
public TreePath getPathForLocation(int x, int y)
随后的TreePath
public Object getLastPathComponent()
返回从点所需的节点,在用户右键点击。
说的ISN有关如何为JPopup添加的MouseListener到JTree的 – mKorbel
的,我认为,问题不在于“如何添加弹出”,而是“如何添加弹出取决于点击节点“ – StanislavL
好,很好的建议+1 – mKorbel
似乎已经引起了一些混乱(混淆自己;-) - 所以这里做的componentPopup
JPopupMenu popup = new JPopupMenu();
final Action action = new AbstractAction("empty") {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
};
popup.add(action);
JTree tree = new JTree() {
/**
* @inherited <p>
*/
@Override
public Point getPopupLocation(MouseEvent e) {
if (e != null) {
TreePath path = getClosestPathForLocation(e.getX(), e.getY());
action.putValue(Action.NAME, String.valueOf(path.getLastPathComponent()));
return e.getPoint();
}
action.putValue(Action.NAME, "no mouse");
return null;
}
};
tree.setComponentPopupMenu(popup);
我把@kleopatra解决方案,改变了它稍微的目标位置相关的配置代码段。 也许这不是最好的方式,但为我工作。
JTree tree = new JTree() {
private static final long serialVersionUID = 1L;
@Override public Point getPopupLocation(MouseEvent e) {
if (e == null) return new Point(0,0);
TreePath path = getClosestPathForLocation(e.getX(), e.getY());
Object selected = path != null ? path.getLastPathComponent() : null;
setComponentPopupMenu(getMenuForTreeNode(getComponentPopupMenu(), selected));
setSelectionPath(path);
return e.getPoint();
}
};
public JPopupMenu getMenuForTreeNode(JPopupMenu menu, Object treeNode) {
if (menu == null) menu = new JPopupMenu("Menu:");
menu.removeAll();
if (treeNode instanceof MyTreeItem) {
menu.add(new JMenuItem("This is my tree item: " + treeNode.toString()));
}
return menu;
}
改变componentPopup实例(不确定是否这样做,只是说:-)会有点脆弱:它取决于getPopupLocation的调用代码来调用getComponentPopup _after_请求位置。 Oracle的BasicLookAndFeel中偶然会出现这种情况,其他实现可能不会 – kleopatra
我修改您的文章,请回复,如果不是... – mKorbel