我的Swing程序中有一个bug,当选择组件时,JButton和JToggleButton组件的背景是灰色的而不是蓝色的。下面是JToggleButton上问题的屏幕截图,但在按下JButton时也会出现同样的问题。

我已经尝试过手动设置背景
button.setBackground(Color.BLUE);
button.setOpaque(true);但这只是在按钮周围画了一个小边框:

还添加了button.setBorderPainted(false);,它删除边框,但也删除macOS按钮的外观完全+给文本一个更深的背景颜色:

它看起来像是边框(AquaButtonBorder)阻止了背景颜色的改变或什么的?因为简单地设置button.setBackground(Color.BLUE);完全没有任何作用。
外观和感觉被设置为UIManager.getSystemLookAndFeelClassName(),但也尝试了失败的UIManager.getCrossPlatformLookAndFeelClassName()。
Java规范:运行在Java 11上,但在Java 17中仍然存在同样的问题
系统规范: M1 MacBook Pro,macOS版本12.4
发布于 2022-06-02 23:47:08
所以,我花了很多时间研究"Aqua“外观和感觉的源代码,我发现AquaButtonUI有一个”按钮类型“客户端属性,用于确定边框类型。
所以,我拿出了所有的内部“类型”做了一个快速测试..。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToggleButton;
import javax.swing.border.EmptyBorder;
public class Main {
    public static void main(String[] args) {
        System.out.println(System.getProperty("user.dir"));
        new Main();
    }
    public Main() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
    public class TestPane extends JPanel {
        private String[] keys = new String[]{
            "toolbar",
            "icon",
            "text",
            "toggle",
            "combobox",
            "comboboxInternal",
            "comboboxEndCap",
            "square",
            "gradient",
            "bevel",
            "textured",
            "roundRect",
            "recessed",
            "well",
            "help",
            "round",
            "texturedRound",
            "segmented-first",
            "segmented-middle",
            "segmented-last",
            "segmented-only",
            "segmentedRoundRect-first",
            "segmentedRoundRect-middle",
            "segmentedRoundRect-last",
            "segmentedRoundRect-only",
            "segmentedTexturedRounded-first",
            "segmentedTexturedRounded-middle",
            "segmentedTexturedRounded-last",
            "segmentedTexturedRounded-only",
            "segmentedTextured-first",
            "segmentedTextured-middle",
            "segmentedTextured-last",
            "segmentedTextured-only",
            "segmentedCapsule-first",
            "segmentedCapsule-middle",
            "segmentedCapsule-last",
            "segmentedCapsule-only",
            "segmentedGradient-first",
            "segmentedGradient-middle",
            "segmentedGradient-last",
            "segmentedGradient-only",
            "disclosure",
            "scrollColumnSizer"
        };
        public TestPane() {
            setBorder(new EmptyBorder(32, 32, 32, 32));
            setLayout(new BorderLayout());
            JPanel contentPane = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            for (String key : keys) {
                JToggleButton btn = new JToggleButton(key);
                btn.putClientProperty("JButton.buttonType", key);
                contentPane.add(btn, gbc);
            }
            add(new JScrollPane(contentPane));
        }
    }
}通常,我发现bevel和segmented-only会达到您想要的结果(尽管segment-first/middle/last看起来很有趣)

https://stackoverflow.com/questions/72482551
复制相似问题