我有这个问题。在自定义 JTree 中,我实现了一个 JPopupMenu 以根据使用 MouseListener 选择的节点显示不同的 JMenuItem。单击鼠标右键时会显示 JPopupMenu。问题是,如果我不从 PopupMenu 中选择一个项目,而是选择树中的另一个节点,无论是使用右按钮还是左按钮,此事件都不会被树捕获 MouseListener 有人能指出我正确的方向吗?解决这个?如果有可用的示例,我将不胜感激。谢谢。
问问题
1703 次
1 回答
1
我建议也许使用 TreeSelectionListener 来确定所选节点的变化,而不是 MouseListener 并在那时重新填充 JPopupMenu,但这是您的选择。
试图模仿您的示例,我想知道您在鼠标侦听器中覆盖了哪些方法?在这个简单的示例中,无论是否显示弹出菜单,侦听器似乎都可以获取事件。
编辑 - 请参阅下面的评论,但右键单击不选择节点是默认行为。如果可能,此示例将选择最接近右键单击的节点。
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);
}
});
}
}
于 2010-07-28T19:02:00.867 回答