我的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
复制相似问题