首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当选择时,Java按钮是灰色的而不是蓝色的

当选择时,Java按钮是灰色的而不是蓝色的
EN

Stack Overflow用户
提问于 2022-06-02 21:30:30
回答 1查看 64关注 0票数 0

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

我已经尝试过手动设置背景

代码语言:javascript
运行
复制
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

EN

Stack Overflow用户

回答已采纳

发布于 2022-06-02 23:47:08

所以,我花了很多时间研究"Aqua“外观和感觉的源代码,我发现AquaButtonUI有一个”按钮类型“客户端属性,用于确定边框类型。

所以,我拿出了所有的内部“类型”做了一个快速测试..。

代码语言:javascript
运行
复制
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));
        }
    }
}

通常,我发现bevelsegmented-only会达到您想要的结果(尽管segment-first/middle/last看起来很有趣)

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72482551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档