JMenu#setEnabled(false) отключает все действия вместо отключения самого меню

В соответствии с вариантом использования, который я должен реализовать, в какой-то момент меню должно быть отключено, поэтому в какой-то момент оно не должно быть кликабельным. Имеет смысл просто установить

JMenu menu = new JMenu();
menu.setEnabled(false);

И действительно, это работает в этом примере кода:

public class MenuTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(FrameTest::new);
    }
}

class FrameTest extends JFrame {

    public FrameTest() {
        super();

        JPanel panel = new JPanel(new GridBagLayout());
        JMenuBar menuBar = new JMenuBar();
        JMenu menu1 = new JMenu("test menu1");
        JMenu menu2 = new JMenu("test menu2");
        menuBar.add(menu1);
        menuBar.add(menu2);
        menu1.setEnabled(false);

        setJMenuBar(menuBar);
        setPreferredSize(new Dimension(400, 400));
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }
}

Но в кодовой базе, над которой я работаю, этот подход не работает, он оставляет меню включенным, но отключает все инкапсулированные действия. Это не то, что я ищу. По определенным причинам, в основном из-за того, что он довольно большой и сюда не влезет, я его не публикую, но идея та же. JMenuBar заполнены JMenu, которые заполнены AbstractActions. Есть ли причины, по которым результаты отличаются при использовании одного и того же метода setEnabled(false) в классе JMenu?


person Bogdan A.    schedule 30.07.2017    source источник
comment
По определенным причинам, главным образом потому, что он довольно большой и не помещается здесь, я не публикую его здесь..... Всегда лучше предоставить минимально воспроизводимый пример   -  person Ansharja    schedule 30.07.2017


Ответы (1)


Почему бы тебе просто не исчезнуть??

menu1.setVisible(false);

и вернуться к истине, когда это необходимо.

Документация для setEnabled(boolean) ясна.

Параметры: b true, чтобы включить элемент @beaninfodescription: реагирует ли компонент на взаимодействие с пользователем.

Компонент находится там, где вы добавляете его, и он просто делает его способным реагировать или не реагировать на взаимодействие с пользователем.

person Tsakiroglou Fotis    schedule 30.07.2017