Java JTree中的jpopmpmenu问题
我有这个问题。在一个定制的JTree中,我实现了一个JPOpupMenus,根据使用鼠标侦听器选择的节点显示不同的JMenuItem。 单击鼠标右键时,将显示JPOPUP菜单。问题是,如果我没有从弹出菜单中选择一个项目,而是选择树中的另一个节点(使用右键或左键),则树鼠标侦听器永远不会捕获此事件 有人能给我指出解决这个问题的正确方向吗?如果有一个例子,我将不胜感激。Java JTree中的jpopmpmenu问题,java,swing,jtree,jpopupmenu,Java,Swing,Jtree,Jpopupmenu,我有这个问题。在一个定制的JTree中,我实现了一个JPOpupMenus,根据使用鼠标侦听器选择的节点显示不同的JMenuItem。 单击鼠标右键时,将显示JPOPUP菜单。问题是,如果我没有从弹出菜单中选择一个项目,而是选择树中的另一个节点(使用右键或左键),则树鼠标侦听器永远不会捕获此事件 有人能给我指出解决这个问题的正确方向吗?如果有一个例子,我将不胜感激。 谢谢 我建议使用TreeSelectionListener来确定所选节点中的更改,而不是鼠标侦听器,并在此时重新填充JPOppMe
谢谢 我建议使用TreeSelectionListener来确定所选节点中的更改,而不是鼠标侦听器,并在此时重新填充JPOppMenu,但这是您的选择 试图模仿您的示例,我想知道,您在鼠标侦听器中覆盖了哪些方法?在这个简单的示例中,无论弹出菜单是否显示,侦听器似乎都会获取事件 编辑-请参阅下面的我的评论,但右键单击不选择节点是默认行为。此示例将选择距离右键单击最近的节点(如果可能)
public class SampleTree extends JFrame {
private JPopupMenu menu = new JPopupMenu("Popup");
public SampleTree() throws HeadlessException {
super("Tree");
final JTree tree = new JTree();
tree.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
TreePath tp = tree.getClosestPathForLocation(e.getX(),e.getY());
if (tp != null) {
System.out.println(tp);
tree.setSelectionPath(tp);
}
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
});
String letters = "ABCDEF";
for (final char letter : letters.toCharArray()) {
JMenuItem item = new JMenuItem(String.valueOf(letter));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(SampleTree.this, "You chose the letter: " + letter);
}
});
menu.add(item);
}
add(new JScrollPane(tree));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
SampleTree st = new SampleTree();
st.setSize(200, 200);
st.setLocationRelativeTo(null);
st.setVisible(true);
}
});
}
}
我建议使用TreeSelectionListener来确定所选节点中的更改,而不是MouseListener,并在此时重新填充JPOppMenu,但这是您的选择 试图模仿您的示例,我想知道,您在鼠标侦听器中覆盖了哪些方法?在这个简单的示例中,无论弹出菜单是否显示,侦听器似乎都会获取事件 编辑-请参阅下面的我的评论,但右键单击不选择节点是默认行为。此示例将选择距离右键单击最近的节点(如果可能)
public class SampleTree extends JFrame {
private JPopupMenu menu = new JPopupMenu("Popup");
public SampleTree() throws HeadlessException {
super("Tree");
final JTree tree = new JTree();
tree.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
TreePath tp = tree.getClosestPathForLocation(e.getX(),e.getY());
if (tp != null) {
System.out.println(tp);
tree.setSelectionPath(tp);
}
menu.show(e.getComponent(), e.getX(), e.getY());
}
}
});
String letters = "ABCDEF";
for (final char letter : letters.toCharArray()) {
JMenuItem item = new JMenuItem(String.valueOf(letter));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(SampleTree.this, "You chose the letter: " + letter);
}
});
menu.add(item);
}
add(new JScrollPane(tree));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
SampleTree st = new SampleTree();
st.setSize(200, 200);
st.setLocationRelativeTo(null);
st.setVisible(true);
}
});
}
}
感谢您重播您的建议,我可以告诉您,我已开始评估TreeSelectionListener,但TreeSelectionEvent无法确定按下了哪个鼠标按钮。关于您的示例,与我的示例非常相似,我们都覆盖了MouseReleased和MousePressed方法,尽管在您的示例中,左按钮的行为与预期的一样,右按钮仍然如我所述,如果弹出菜单仍然可见,MousePressed和MouseSeclicked不会接收事件。如果您找到了解决方案,请重新发布。根据以下错误报告,我相信这是JTree的默认行为:。我修改了我的示例,以演示如何通过鼠标右键单击选择节点以编程方式执行此操作。感谢您重播您的建议,我可以看出我已开始评估TreeSelectionListener,但TreeSelectionEvent无法确定按下了哪个鼠标按钮。关于您的示例,与我的示例非常相似,我们都覆盖了MouseReleased和MousePressed方法,尽管在您的示例中,左按钮的行为与预期的一样,右按钮仍然如我所述,如果弹出菜单仍然可见,MousePressed和MouseSeclicked不会接收事件。如果您找到了解决方案,请重新发布。根据以下错误报告,我相信这是JTree的默认行为:。我修改了我的示例,以演示如何通过鼠标右键单击选择节点以编程方式执行此操作。无法复制(使用jdk6u27):mouseEvents到达树上安装的侦听器,与弹出窗口是否可见无关。因此,可能是core中的一个bug现在已经修复,或者是代码中的一个bug没有显示:-)无法复制(使用jdk6u27):mouseEvents到达树上安装的侦听器,与弹出窗口是否可见无关。所以可能是内核中的一个bug现在已经修复了,或者是代码中的一个bug没有显示:-)