我先使用JMenuBar禁用FileDialog,然后再显示FileDialog(因为当getJMenuBar().setEnabled(false)可见时菜单项仍处于 Activity 状态),然后在getJMenuBar().setEnabled(true)关闭后调用FileDialog,但是菜单项在启用后不会变为 Activity 状态-我转到另一个应用程序,然后回到我的。我尝试调用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();
    }

}

预先感谢您的评论/建议!

最佳答案

对我来说,我可以通过启用/禁用每个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();
                });
    }

}

09-16 06:03