我的 Swing 程式中有一個錯誤,當組件被選中時,組件的背景是灰色而不是藍色JButton。JToggleButton這是 a 上問題的螢屏截圖JToggleButton,但按下 a 時會出現同樣的問題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
uj5u.com熱心網友回復:
Sooo,我花了很多時間研究“Aqua”外觀和感覺的源代碼,我發現它AquaButtonUI有一個“按鈕型別”客戶端屬性,用于(以及其他一些東西)確定邊框型別。
Sooo,我提取了所有內部“型別”并進行了快速測驗......
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://www.uj5u.com/qukuanlian/491731.html
