Качать всплывающее меню на компонент и его содержимое

У меня есть компонент (Widget - расширяет JPanel), в котором я реализовал простое всплывающее меню. Он работает при нажатии на границу панели и практически везде, кроме тех мест, где макет панели содержит какой-либо другой компонент внутри панели.

Поэтому, если внутри панели есть JTable, я могу вызвать меню, щелкнув рядом с ним (если больше ничего нет), но при нажатии на JTable ничего не происходит (таблица явно находится на верхней части панели, не позволяя MouseAdapter зарегистрировать клик).

Можно ли как-нибудь вызвать всплывающее меню при щелчке правой кнопкой мыши даже на компонентах внутри панели? Вот пример кода, как я создаю и вызываю меню:

private void initPopupMenu() {
        popup = new JPopupMenu();

        JMenuItem closeItem = new JMenuItem("Close");
        closeItem.setActionCommand(WidgetConstants.Actions.CLOSE.name());
        closeItem.addActionListener(this);
        popup.add(closeItem);

        JMenuItem minimizeItem = new JMenuItem("Minimize");
        minimizeItem.setActionCommand(WidgetConstants.Actions.MINIMIZE.name());
        minimizeItem.addActionListener(this);
        popup.add(minimizeItem);
    }

MouseInputListener componentListener = new MouseInputAdapter() {

        @Override
        public void mousePressed(MouseEvent me) {
            // popup
            if (me.isPopupTrigger()) {
                popup.show(me.getComponent(), me.getX(), me.getY());
            }
        }

        @Override
        public void mouseReleased(MouseEvent ev) {
            if (ev.isPopupTrigger()) {
                popup.show(ev.getComponent(), ev.getX(), ev.getY());
            }
        }
}

@Override
public void setBorder(Border border) {
        removeMouseListener(componentListener);
        removeMouseMotionListener(componentListener);
        if (border instanceof WidgetBorder) {
            addMouseListener(componentListener);
            addMouseMotionListener(componentListener);
        }
        super.setBorder(border);
    }

Спасибо за любые советы.

1 ответ

Решение

Прежде всего: вам не нужно использовать мышь слушателя. У каждого JComponent есть свой метод setComponentPopupMenu(JPopupMenu), Secon: вы можете просматривать дерево компонентов и регистрировать всплывающее меню для каждого компонента.

Вот пример:

/**
 * Provides component hierarchy traversal.
 *
 * @param aContainer start node for the traversal.
 */
private void traverse(Container aContainer, JPopupMenu aMenu) {
    for (final Component comp : aContainer.getComponents()) {
        if (comp instanceof JComponent) {
            ((JComponent) comp).setComponentPopupMenu(aMenu);
        }
        if (comp instanceof Container) {
            traverse((Container) comp, aMenu);
        }
    }
}
Другие вопросы по тегам