setEnabled(false)不会阻止JMenuItem通过WindowsLookAndFeel突出显示

时间:2014-08-16 16:34:45

标签: java swing user-interface menuitem look-and-feel

我正在尝试动态填充子菜单,如果其中没有元素,我想在其中添加一个禁用的JMenuItem,文本为“(empty)”。但是,由于L& F设置为系统L& F(Windows,在我的情况下),JMenuItem在鼠标悬停时突出显示。我该如何避免这种情况?它在没有设置L& F的情况下完全按照预期工作,但L& F设置为系统的事实并不是我可以改变的事情(因为这是更大的一部分)。

这是一个SSCCE:

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class HelpMenuItem {

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    protected static void createAndShowGUI() {          
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException | InstantiationException
                | IllegalAccessException | UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }

        JFrame frame = new JFrame();

        JMenuBar menuBar = new JMenuBar();
        menuBar.setVisible(true);

        JMenu menu = new JMenu("Test");
        JMenu sub = new JMenu("SubMenu");

        JMenuItem empty = new JMenuItem("(empty)");
        empty.setEnabled(false);

        menuBar.add(menu);
        menu.add(sub);
        sub.add(empty);

        frame.setJMenuBar(menuBar);
        JPanel panel = new JPanel();
        panel.add(new JLabel("Test"));
        frame.setContentPane(panel);
        frame.pack();       
        frame.setVisible(true);     
    }

}

1 个答案:

答案 0 :(得分:1)

您必须设置您创建组件的LAF before。您的SSCCE错误地说明了您的问题。

如果您先设置LAF,那么您会注意到Windows上的不同行为。所有你会看到的是#34;焦点边界"正在绘制的菜单项。

禁用"焦点边框的绘制"你可以使用UIManager。您可以使用:

UIManager.put("MenuItem.disabledAreNavigable", Boolean.FALSE);

有关UIManager的详细信息,请查看UIManager Defaults