Хорошо, таким образом, вот моя проблема:
У меня есть приложение, я работаю с этим, создает Диалоговое окно, которое имеет JTree в нем. когда кто-то щелкает правой кнопкой по JTree, я должен определить если в папке 2010 года. Если это, я должен создать всплывающее меню с одной опцией: "Мигрируйте на 2011".
Я имел, имею, теперь то, что у меня есть всплывающее окно меню с правильным текстом, и близко когда я нажимаю на него или когда я нажимаю прочь. Однако, когда я нажимаю на Migrate к 2011, ничего не происходит, он, привычка выполняет мой ActionPerformed, и делает странное высвечивание на вершине диалогового окна.
Я создал новый класс для попытки к diagnos проблемы, но сталкиваюсь с новой проблемой. Это - класс стороны, который я сделал, чтобы попытаться выяснить то, что было неправильным, когда я выполняю его, он заполняет прекрасный и открывает прекрасный пункт меню. Однако при нажатии на пункт меню, он на самом деле не закрывает меню, вместо этого он только выполняет метод 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);
}
}
Правильный способ показать JPopupMenu
- использовать его show
метод. Посмотрите на API:
В дополнение к этому я предлагаю использовать Actions
вместо простых слушателей действий. Они более гибкие и могут быть использованы не только в меню, но и на панелях инструментов и т.д. Вот что можно почитать о действиях:
http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/uiswing/misc/action.html
Использовать событие mouseReleased в mouseAdapter
public void mouseReleased(MouseEvent ae) {
if(ae.isPopupTrigger()){
popup.show(ae.getComponent(),ae.getX(),ae.getY());
}
TreePath tp = tree.getPathForLocation(ae.getX(), ae.getY());
if (tp != null)
jtf.setText(tp.toString());
else
jtf.setText("");
}