JTree и раскрывающиеся опции на узлах, щелкающих правой кнопкой мыши - PullRequest
2 голосов
/ 10 ноября 2011

Я пытаюсь использовать JTree и реализовать различные раскрывающиеся списки для всех родительских узлов и дочерних узлов.

Вот что я сделал:

pmTree.addMouseListener(new java.awt.event.MouseAdapter() {
        @Override
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            try {
            if(evt.getButton() == evt.BUTTON1) {
            }
            else if (evt.getButton() == evt.BUTTON3) {
                TreePopup(evt);
                //pmTree.updateUI();
            }
            }catch (Exception e) {}
        }
    });

и PopupCode:

public void TreePopup(java.awt.event.MouseEvent evt) {
    DefaultMutableTreeNode node = (DefaultMutableTreeNode)  pmTree.getLastSelectedPathComponent();
    popup = new JPopupMenu();
    popup.setInvoker(pmTree);
    PopupHandler handler = new PopupHandler(pmTree, popup);
    if(node.getLevel() == 1)
    {
        popup.add(getMenuItem("Parent Node", handler));
    }
    else if(node.getLevel() == 2)
    {
        popup.add(getMenuItem("Child", handler));
     }
     }

и PopUpHandler:

public class PopupHandler extends javax.swing.JFrame implements ActionListener {
JPopupMenu popup;
Point loc;

public PopupHandler(JTree tree, JPopupMenu popup) {
    //this.tree = NewJFrame.pmTree;
    this.popup = popup;
    tree.addMouseListener(ma);
}

, а также

public void actionPerformed(java.awt.event.ActionEvent evt)  

для узла Child или Parent, по которому щелкают.

ОднакоКогда я запускаю программу, я получаю ОДНО ЖЕ всплывающие окна правой кнопкой мыши для дочернего и родительского узла.

Извините за огромный кусок кода.Я застрял с ним в течение 2 дней и все же не удалось.Спасибо!

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Не переходите на более низкий уровень, как MouseListener, вместо этого используйте API вокруг componentPopupMenu. При этом общий подход заключается в динамическом конфигурировании componentPopup в методе getPopupLocation, некотором простом фрагменте примера:

    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) {
               // here do your custom config, like f.i add/remove menu items based on context
               // this example simply changes the action name 
               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);
2 голосов
/ 10 ноября 2011

Вы проверяете выбранный узел:

DefaultMutableTreeNode node = (DefaultMutableTreeNode)pmTree.getLastSelectedPathComponent();

, чтобы увидеть, есть ли у вас «родительский» или «дочерний» узел.Сначала вы должны выбрать узел в позиции мыши, иначе он не будет правильным узлом.Звоните

TreePath path = pmTree.getPathForLocation(evt.getX(), evt.getY());
if (path != null) {
    pmTree.setSelectionPath(path);
} else {
    return;
}

в начале treePopup.(методы в Java должны начинаться со строчной буквы!)

1 голос
/ 01 мая 2013

Высокий.Мне удалось поместить вызов setSelectionPath() в переопределение getPopupLocaiton().Я пытался сделать это внутри ActionListener моего JMenuItem безрезультатно.

public Point getPopupLocation( MouseEvent e ) {
    Point point = null;
    if( e != null ) {
        TreePath path = getClosestPathForLocation( e.getX(), e.getY() );
        setSelectionPath( path );
        point = e.getPoint();
    }
    return point;
}
...