Как сделать JPopupMenu невидимым?

249
12 ноября 2021, 02:40

Не получается отключать JPopupMenu методами setVisible() и setEnabled(). Отдельные JMenuItem без проблем обрабатываются этими методами, а вот меню целиком никак на них не реагирует. Как можно сделать, чтобы контекстное меню появлялось по правому клику только когда нужно? Какой метод способен включать и отключать его целиком?

import javax.swing.*;
public class PopupMenus extends JFrame {
    public PopupMenus() {
        super("PopupMenus");
        setDefaultCloseOperation( EXIT_ON_CLOSE );
        JPopupMenu popup = createPopupMenu();
        ((JComponent)getContentPane()).
                setComponentPopupMenu(popup);
        setSize(300, 200);
        popup.setVisible(false); // Эти строки можно удалить.
        popup.setEnabled(false); // Они не влияют ни на что.
        setVisible(true);
    }
    private JPopupMenu createPopupMenu() {
        JPopupMenu pm = new JPopupMenu();
        JMenuItem good = new JMenuItem("Один");
        JMenuItem excellent = new JMenuItem("Два");
        pm.add(good);
        pm.add(excellent);
        return pm;
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(
                PopupMenus::new);
    }
}

Строки

popup.setVisible(false);
popup.setEnabled(false);

не влияют на появление контекстного меню. Оно появляется при клике правой кнопкой мыши в любом случае. Что нужно сделать, чтобы была возможность отключать и включать возможность показа всего контекстного меню?

Answer 1

Набросал решеньице. Просто надо setComponentPopupMenu(null) сделать.

boolean showed = true;
PopupMenus() {
    super("PopupMenus");
    setDefaultCloseOperation( EXIT_ON_CLOSE );
    JPopupMenu popup = createPopupMenu();
    ((JComponent)getContentPane()).setComponentPopupMenu(popup);
    setSize(300, 200);
    JPanel jPanel = new JPanel();
    add(jPanel);
    JButton jButton = new JButton("Button");
    jButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (showed) {
                ((JComponent)getContentPane()).setComponentPopupMenu(null);
                showed = false;
            } else {
                ((JComponent)getContentPane()).setComponentPopupMenu(popup);
                showed = true;
            }
        }
    });
    // Или более коротко
    // jButton.addActionListener(e -> ((JComponent)getContentPane()).setComponentPopupMenu((showed = !showed) ? popup : null));
    jPanel.add(jButton);
    setVisible(true);
}
READ ALSO
Сапер. Проверка нулевых клеток

Сапер. Проверка нулевых клеток

Java Если нажимаем на пустую клетку, все пустые вокруг открываются до непустыхКажется происходит зацикливание, пока не могу понять почему

189
Как заменить одно значения двух массивов, чтобы после замены у них было одинаковая сумма. (java) [закрыт]

Как заменить одно значения двух массивов, чтобы после замены у них было одинаковая сумма. (java) [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

93
spring crudRepository null pointer exception

spring crudRepository null pointer exception

Есть класс @Entity ResultCode, далее есть интерфейс который extends CrudRepository, в классе контроллера я могу пользоваться resultCodeRepository интерфейсом, но в других...

74