好吧,这是我的问题:
我有一个正在使用的应用程序,它创建了一个包含 JTree 的对话框。当有人右键单击 JTree 时,我需要确定它是否在 2010 文件夹中。如果是,我需要创建一个带有一个选项的弹出菜单:“迁移到 2011”。
我现在拥有的是弹出菜单并带有正确的文本,并在单击它或单击关闭时关闭。但是,当我单击 Migrate to 2011 时,没有任何反应,它不会运行我的 ActionPerformed,并在对话框窗口顶部发出奇怪的闪烁。
我创建了一个新类来尝试诊断问题,但遇到了一个新问题。这是我为尝试找出问题所在而制作的附带课程,当我运行它时,它会很好地填充并很好地打开菜单项。但是,当您单击菜单选项时,它实际上并没有关闭菜单,而是仅运行 ActionPerformed 方法而没有其他任何内容。
这是代码示例:
//Import statements
public class MainClass extends JPanel {
public MainClass() {
final JPopupMenu popup = new JPopupMenu();
final JTree tree;
final JTextField jtf;
JMenuItem menuItem = new JMenuItem("Migrate to 2011");
ActionListener actionlistener = new PopupActionListener();
menuItem.addActionListener(actionlistener);
popup.add(menuItem);
DefaultMutableTreeNode top = new DefaultMutableTreeNode("Options");
DefaultMutableTreeNode a = new DefaultMutableTreeNode("A");
top.add(a);
DefaultMutableTreeNode a1 = new DefaultMutableTreeNode("A1");
a.add(a1);
DefaultMutableTreeNode a2 = new DefaultMutableTreeNode("A2");
a.add(a2);
DefaultMutableTreeNode b = new DefaultMutableTreeNode("B");
top.add(b);
DefaultMutableTreeNode b1 = new DefaultMutableTreeNode("B1");
b.add(b1);
DefaultMutableTreeNode b2 = new DefaultMutableTreeNode("B2");
b.add(b2);
DefaultMutableTreeNode b3 = new DefaultMutableTreeNode("B3");
b.add(b3);
tree = new JTree(top);
JScrollPane jsp = new JScrollPane(tree);
add(jsp, BorderLayout.WEST);
jtf = new JTextField("", 20);
add(jtf, BorderLayout.EAST);
tree.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent ae) {
popup.setVisible(false);
TreePath tp = tree.getPathForLocation(ae.getX(), ae.getY());
if (tp != null)
jtf.setText(tp.toString());
else
jtf.setText("");
if(SwingUtilities.isRightMouseButton(ae)){
popup.setLocation(ae.getLocationOnScreen());
popup.setVisible(true);
}
}
});
}
class PopupActionListener implements ActionListener {
public void actionPerformed(ActionEvent ae) {
System.out.println("it works!");
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.getContentPane().add(new MainClass());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 450);
frame.setVisible(true);
}
}