JMenuBar在被禁用后无法启用

3
我正在禁用一个JMenuBar,在显示FileDialog之前(因为当FileDialog可见时,菜单项仍然处于活动状态),使用getJMenuBar().setEnabled(false),然后在FileDialog关闭后调用getJMenuBar().setEnabled(true),但是启用后菜单项并没有变得活跃 - 如果我切换到另一个应用程序然后再切回我的应用程序,它们会变得活跃。我尝试了调用getJMenuBar().revalidate()和/或getJMenuBar().repaint(),但都没有效果。
值得注意的是,我正在使用屏幕菜单栏,因为我使用的是OS X。以下是示例代码,可以展示这个问题:
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener;

public class MenuTest extends JFrame implements ActionListener {

    private JMenuItem menuItemNew = new JMenuItem("New");
    private JMenuItem menuItemOpen = new JMenuItem("Open");
    private JMenuItem menuItemSave = new JMenuItem("Save");
    private JMenu menuFile = new JMenu("File");
    private JMenuBar menuBar = new JMenuBar();

    public MenuTest() {
        super("JMenu Test");
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        menuItemOpen.addActionListener(this);

        menuFile.add(menuItemNew);
        menuFile.add(menuItemOpen);
        menuFile.add(menuItemSave);
        menuBar.add(menuFile);
        setJMenuBar(menuBar);

        setVisible(true);
    }

    public void openFile() {
        getJMenuBar().setEnabled(false);
        FileDialog fd = new FileDialog(this, "Choose a file", FileDialog.LOAD);
        fd.setVisible(true);
        getJMenuBar().setEnabled(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == menuItemOpen) {
            openFile();
        }
    }

    public static void main(String[] arguements) {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        new MenuTest();
    }

}

感谢您事先提供的评论/建议!


为什么?FileDialog不是模态对话框吗? - MadProgrammer
它会禁用其后面的窗口,但不会禁用菜单栏。如果我没有将系统属性设置为在OS X中作为屏幕菜单栏,则它也会禁用菜单栏。 - Clint
啊,你可能想在你的问题中指出你正在使用的是OSX操作系统;) - MadProgrammer
谢谢,已更新 :) - Clint
1个回答

1
对我而言,我可以通过启用/禁用每个JMenuItem来解决问题,而不是菜单栏或菜单本身。
我还在EDT上执行了所有操作,以防万一这是问题,但没有帮助。
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener;

public class MenuTest implements ActionListener {

    private JMenuItem menuItemNew = new JMenuItem("New");
    private JMenuItem menuItemOpen = new JMenuItem("Open");
    private JMenuItem menuItemSave = new JMenuItem("Save");
    private JMenu menuFile = new JMenu("File");
    private JMenuBar menuBar = new JMenuBar();
    JFrame frame;
    public MenuTest() {

    }

    public void buildGui(){
        frame = new JFrame("JMenu Test");
        frame.setSize(300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        menuItemOpen.addActionListener(this);

        menuFile.add(menuItemNew);
        menuFile.add(menuItemOpen);
        menuFile.add(menuItemSave);

        menuBar.add(menuFile);
        frame.setJMenuBar(menuBar);

        frame.setVisible(true);
    }

    public void openFile() {
        menuItemNew.setEnabled(false);
        menuItemOpen.setEnabled(false);
        menuItemSave.setEnabled(false);

        FileDialog fd = new FileDialog(frame, "Choose a file", FileDialog.LOAD);
        fd.setVisible(true);

        menuItemNew.setEnabled(true);
        menuItemOpen.setEnabled(true);
        menuItemSave.setEnabled(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

            openFile();
        }

    public static void main(String[] arguements) {
        System.setProperty("apple.laf.useScreenMenuBar", "true");
        EventQueue.invokeLater(()->{
            new MenuTest().buildGui();
                });
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接