Добавьте меню JPopup, щелкнув правой кнопкой мыши узел в Swing на Java - PullRequest
2 голосов
/ 22 июня 2011

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

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

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

Ответы [ 3 ]

3 голосов
/ 23 июня 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);
3 голосов
/ 22 июня 2011

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

public TreePath getPathForLocation(int x, int y)

Затем TreePath

public Object getLastPathComponent()

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

0 голосов
/ 14 декабря 2012

Я взял раствор @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;
}
...