Я пытаюсь реализовать всплывающие меню в Java JTree. Я подклассифицировал DefaultTreeCellRenderer (для изменения внешнего вида узла) и DefaultTreeCellEditor (для создания компонентов для присоединения прослушивателей событий, поскольку, по-видимому, Компоненты, возвращаемые DefaultTreeCellRenderer.getTreeCellRendererComponent(), не могут это сделать?). Я действительно не хочу «редактировать» узлы, просто смогу всплывать меню, когда узел получает щелчок правой кнопкой мыши, но это единственный способ, которым я могу сейчас это сделать ...Щелкните правой кнопкой мыши контекстное меню для Java JTree?
Ниже приведен код, который у меня есть до сих пор. Я просто пытаюсь понять, как захватить MouseEvents. Это вроде работы, но плохо. Какой лучший способ выполнить то, что я пытаюсь сделать здесь?
private class My_TreeCellRenderer extends DefaultTreeCellRenderer {
My_TreeCellRenderer() {
super();
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
// set label text and tool tips
setText(((My_Object)value).getTreeLabel());
setToolTipText(((My_Object)value).getTreeToolTip());
return this;
}
}
private class My_TreeCellEditor extends DefaultTreeCellEditor {
private MouseAdapter ma;
My_TreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
super (tree, renderer);
ma = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
if (e.isPopupTrigger()) {
System.out.println("My Popup");
}
}
public void mouseReleased(MouseEvent e) {
if (e.isPopupTrigger()) {
System.out.println("My Popup");
}
}
};
}
public Component getTreeCellEditorComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row) {
String src_filename = null;
// return non-editing component
Component c = renderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, true);
// add mouse listener if it's not listening already
MouseListener mouseListeners[] = c.getMouseListeners();
int i;
for (i=0; i < mouseListeners.length && mouseListeners[i] != ma; i++);
if (i >= mouseListeners.length)
c.addMouseListener(ma);
return c;
}
protected boolean canEditImmediately(EventObject event) {
if (event instanceof MouseEvent && ((MouseEvent)event).getClickCount() == 1)
return true;
else
return false;
}
}
Вы создаете JPopupMenu каждый раз. Переместите создание в другое место, где это делается только после его изменения в событии –
Это хороший пример преждевременной оптимизации (http://en.wikiquote.org/wiki/Donald_Knuth). Нет смысла создавать долгоживущий объект, пока не будет причин для этого (медленная инициализация ресурсов, например). –