У меня есть эта проблема. В пользовательском JTree я реализовал JPopupMenu для отображения другого JMenuItem в соответствии с выбранным узлом с помощью MouseListener. JPopupMenu отображается при щелчке правой кнопкой мыши. Проблема в том, что если я не выберу Item из PopupMenu, но вместо этого я выбираю другой узел в дереве, либо с правой, либо с левой кнопкой, это событие никогда не попадает в дерево. MouseListener Может ли кто-нибудь указать мне в правильном направлении решить это? В случае, если будет доступен пример, я буду признателен. Спасибо.Проблема с JPopupMenu в JTree
ответ
Я бы предположил, что, возможно, используя TreeSelectionListener для определения изменений в выбранном узле, в отличие от MouseListener, и повторного заполнения JPopupMenu в этот момент, но это ваш выбор.
Пытаясь подражать вашему примеру, мне было интересно, какие методы вы переопределили в слушателе мыши? В этом простом примере слушатель, кажется, получает события независимо от того, отображается ли всплывающее меню или нет.
EDIT - см. Мой комментарий ниже, но правый щелчок, не выбирающий узел, является поведением по умолчанию. В этом примере выберем ближайший узел, где был бы сделан правый щелчок.
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 и MousseClicked не получают событие, если popupMenu все еще видно. Если вы нашли решение, отправьте его С уважением – Alex
Я считаю, что это поведение по умолчанию для JTree теперь основано на этом отчете об ошибке: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4196497. Я изменил свой пример, чтобы продемонстрировать, как вы могли бы сделать это программно, выбрав узел правой кнопкой мыши. – jridley
не может воспроизвести (с помощью jdk6u27): mouseEvents достигает слушателя, установленного на дереве, независимо от того, является ли всплывающее окно видимым или нет. Так может быть ошибка в ядре теперь исправлена или ошибка в коде, который вы не показывали :-) – kleopatra