无法在 macOS 上的 Swing 应用程序中更改 JMenu 文本颜色

问题描述 投票:0回答:1

我正在 macOS 上使用 JMenuBar 和 JMenu 开发 Java Swing 应用程序。我试图使用 setForeground(Color.RED) 方法将菜单项的文本颜色更改为红色,但它不起作用。即使应用更改后,菜单文本也始终以默认颜色显示。

我怀疑这可能与 macOS 的原生外观集成有关,该集成会覆盖一些自定义设置。这是我正在使用的代码:

package university.management.system;

import java.awt.*;
import javax.swing.*;

public class Project extends JFrame {

    Project() {
        setSize(1440, 900);

        
        ImageIcon i1 = new ImageIcon(ClassLoader.getSystemResource("icons/third.jpg"));
        Image i2 = i1.getImage().getScaledInstance(2250, 1500, Image.SCALE_DEFAULT);
        ImageIcon i3 = new ImageIcon(i2);
        JLabel image = new JLabel(i3);
        add(image);

       
        JMenuBar mb = new JMenuBar();

    
        JMenu newInfo = new JMenu("New Information");
        newInfo.setForeground(Color.RED); // Trying to set text color to red
        mb.add(newInfo);

        setJMenuBar(mb);
        setVisible(true);
    }

    public static void main(String[] args) {
        // Disable macOS native menu bar integration
        System.setProperty("apple.laf.useScreenMenuBar", "false");

        new Project();
    }
}

在 JMenu 对象上使用 setForeground(Color.RED)。 禁用 macOS 本机菜单栏与

System.setProperty("apple.laf.useScreenMenuBar", "false");
的集成 尝试了 UIManager 属性:

UIManager.put("Menu.foreground", Color.RED);
UIManager.put("Menu.selectionBackground", Color.LIGHT_GRAY);

尝试使用自定义外观和感觉 (

CrossPlatformLookAndFeel
)。 尽管进行了这些尝试,菜单文本颜色在 macOS 上仍然保持不变。相同的代码在 Windows 上按预期运行。

为什么 setForeground 方法在 macOS 上不起作用? 如何在 macOS Swing 应用程序中强制执行自定义菜单文本颜色? 是否有解决方法或替代方法来实现这一目标?

java macos swing look-and-feel jmenu
1个回答
0
投票

您正在菜单而不是菜单栏上设置 setForeground color,如果您在菜单栏上设置 setForeground color 那么它将起作用,请检查下面

package university.management.system;

import java.awt.*;
import javax.swing.*;

public class Project extends JFrame {

    Project() {
        setSize(1440, 900);

        
        ImageIcon i1 = new ImageIcon(ClassLoader.getSystemResource("icons/third.jpg"));
        Image i2 = i1.getImage().getScaledInstance(2250, 1500, Image.SCALE_DEFAULT);
        ImageIcon i3 = new ImageIcon(i2);
        JLabel image = new JLabel(i3);
        add(image);

       
        JMenuBar mb = new JMenuBar();

    
        JMenu newInfo = new JMenu("New Information");
        //newInfo.setForeground(Color.RED); // Trying to set text color to red
        mb.add(newInfo);
        mb.setForeground(Color.RED);

        setJMenuBar(mb);
        setVisible(true);
    }

    public static void main(String[] args) {
        // Disable macOS native menu bar integration
        System.setProperty("apple.laf.useScreenMenuBar", "false");

        new Project();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.