Добавьте меню JPopup, щелкнув правой кнопкой мыши узел в Swing в Java.

В графическом интерфейсе я показываю один JTree слева от JPanel. Теперь для каждого Node(leaf) при щелчке правой кнопкой мыши я хочу отобразить меню JPopup с запросом на отображение статистики о Node справа JPanel.

Поскольку я новичок в качании, может ли кто-нибудь помочь с кодом. Заранее спасибо.

С уважением, Тушар Додиа.


person tushar    schedule 22.06.2011    source источник
comment
Я исправляю ваш пост, пожалуйста, вернитесь, если это не так ...   -  person mKorbel    schedule 22.06.2011


Ответы (3)


Используйте метод JTree

public TreePath getPathForLocation(int x, int y)

Затем путь к дереву

public Object getLastPathComponent()

Это возвращает вам желаемый узел из точки, где пользователь щелкнул правой кнопкой мыши.

person StanislavL    schedule 22.06.2011
comment
это о том, как добавить MouseListener для JPopup в JTree - person mKorbel; 22.06.2011
comment
Я думаю, что вопрос не в том, как добавить всплывающее окно, а в том, как добавить всплывающее окно в зависимости от нажатого узла. - person StanislavL; 22.06.2011
comment
я тоже :) возможно, вам следует упомянуть getTooltip(MouseEvent) как место для настройки всплывающего окна компонента в зависимости от узла в этом месте - person kleopatra; 22.06.2011

Кажется, это вызвало некоторую путаницу (сам запутался ;-) - так что вот фрагмент кода для выполнения конфигурации компонентаPopup, связанной с целевым местоположением.

    JPopupMenu popup = new JPopupMenu();
    final Action action = new AbstractAction("empty") {

        @Override
        public void actionPerformed(ActionEvent e) {
            // TODO Auto-generated method stub
        }
    };
    popup.add(action); 
    JTree tree = new JTree() {

        /** 
         * @inherited <p>
         */
        @Override
        public Point getPopupLocation(MouseEvent e) {
            if (e != null) {
               TreePath path = getClosestPathForLocation(e.getX(), e.getY());
               action.putValue(Action.NAME, String.valueOf(path.getLastPathComponent()));
               return e.getPoint();
            }
            action.putValue(Action.NAME, "no mouse"); 
            return null;
        }

    };
    tree.setComponentPopupMenu(popup);
person kleopatra    schedule 23.06.2011

Я взял решение @kleopatra и немного изменил его. Может быть, это не лучший способ, но работает для меня.

JTree tree = new JTree() {
    private static final long serialVersionUID = 1L;
    @Override public Point getPopupLocation(MouseEvent e) {
        if (e == null) return new Point(0,0);
        TreePath path = getClosestPathForLocation(e.getX(), e.getY());
        Object selected = path != null ? path.getLastPathComponent() : null;
        setComponentPopupMenu(getMenuForTreeNode(getComponentPopupMenu(), selected));
        setSelectionPath(path);
        return e.getPoint();
    }
};



public JPopupMenu getMenuForTreeNode(JPopupMenu menu, Object treeNode) {
    if (menu == null) menu = new JPopupMenu("Menu:");
    menu.removeAll();
    if (treeNode instanceof MyTreeItem) {
        menu.add(new JMenuItem("This is my tree item: " + treeNode.toString()));
    }
    return menu;
}
person drzymala    schedule 13.12.2012
comment
изменение экземпляра componentPopup (не уверен, что вы это сделаете, просто скажите :-) будет немного хрупким: это зависит от вызывающего кода getPopupLocation для вызова getComponentPopup после запроса местоположения. Что случайно происходит в Oracle BasicLookAndFeel, другие реализации могут не - person kleopatra; 28.04.2014