PLAF 无法更改按钮颜色
PLAF can't change button color
我们有一个程序可以在“白天”(high-contrast) 和“夜间”(low-contrast) 模式之间切换。这是通过即时更改 look-and-feel 来完成的。它适用于几乎所有组件,但有一些会忽略背景颜色的变化。特别是,我注意到按钮、组合框和 table headers 都忽略了 PLAF 中的更改。
这是一个带有按钮的示例程序。难道我做错了什么?这是某种 OS-dependent 行为吗? (我在OSX)
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.plaf.ColorUIResource;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class Demo extends JFrame {
public static void main(String[] args) {
new Demo();
}
public Demo() {
setTitle("PLAF button test");
final Demo thisWindow = this;
final JButton button = new JButton("Click me!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Color curColor = UIManager.getColor("Button.background");
ColorUIResource targetColor;
if (curColor.equals(new Color(32, 32, 32))) {
targetColor = new ColorUIResource(192, 192, 192);
}
else {
targetColor = new ColorUIResource(32, 32, 32);
}
System.out.println("Setting new color to " + targetColor +
" because old color was " + curColor);
UIManager.put("Button.background", targetColor);
SwingUtilities.updateComponentTreeUI(thisWindow);
}
});
add(button);
setMinimumSize(new java.awt.Dimension(200, 200));
setVisible(true);
}
}
这是我 运行 这个程序并单击按钮时得到的输出:
Setting new color to javax.swing.plaf.ColorUIResource[r=32,g=32,b=32] because old color was com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]
Setting new color to javax.swing.plaf.ColorUIResource[r=192,g=192,b=192] because old color was javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]
Setting new color to javax.swing.plaf.ColorUIResource[r=32,g=32,b=32] because old color was javax.swing.plaf.ColorUIResource[r=192,g=192,b=192]
Setting new color to javax.swing.plaf.ColorUIResource[r=192,g=192,b=192] because old color was javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]
所以 UIManager 认为颜色在改变,但表观颜色 on-screen 没有改变。
任何建议表示赞赏。谢谢你的时间。
Is this an OS-dependent behavior somehow?
仅在 UI 委托控制组件外观的意义上,效果是 OS 相关的,并且每个支持的平台都定义了一个默认值 Look & Feel. On Mac OS X, the default is com.apple.laf.AquaLookAndFeel
; here is the corresponding source. As shown in UIManager Defaults, cited here,UIManager
"Button.background"
的键具有
的浅灰色值
com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]
但是分配的 space 完全被本机组件覆盖。类似的效果遮盖了为 "RadioBUtton.icon"
显示的浅粉色占位符。一些缓解策略:
按照建议here,您可以设置封闭的背景JPanel
。
按照建议 here,您可以使用 setOpaque()
为背景着色 一些; darker()
阴影可能会有帮助。
JButton b = new JButton("Test");
b.setOpaque(true);
b.setBackground(Color.red.darker());
如果使用Border
,记得"put the component in a JPanel
and set the border on the JPanel
."
使用控件,例如 here,让用户选择首选的外观;将选择保留在 java.util.prefs.Preferences
.
的实例中
将用户引导至 Mac OS X Accessibility 系统偏好设置面板中的对比度选项。
将特定于平台的代码包装在合适的谓词中。
if (System.getProperty("os.name").startsWith("Mac OS X")) {
// Specific to Mac OS X
}
我们有一个程序可以在“白天”(high-contrast) 和“夜间”(low-contrast) 模式之间切换。这是通过即时更改 look-and-feel 来完成的。它适用于几乎所有组件,但有一些会忽略背景颜色的变化。特别是,我注意到按钮、组合框和 table headers 都忽略了 PLAF 中的更改。
这是一个带有按钮的示例程序。难道我做错了什么?这是某种 OS-dependent 行为吗? (我在OSX)
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.plaf.ColorUIResource;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
public class Demo extends JFrame {
public static void main(String[] args) {
new Demo();
}
public Demo() {
setTitle("PLAF button test");
final Demo thisWindow = this;
final JButton button = new JButton("Click me!");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Color curColor = UIManager.getColor("Button.background");
ColorUIResource targetColor;
if (curColor.equals(new Color(32, 32, 32))) {
targetColor = new ColorUIResource(192, 192, 192);
}
else {
targetColor = new ColorUIResource(32, 32, 32);
}
System.out.println("Setting new color to " + targetColor +
" because old color was " + curColor);
UIManager.put("Button.background", targetColor);
SwingUtilities.updateComponentTreeUI(thisWindow);
}
});
add(button);
setMinimumSize(new java.awt.Dimension(200, 200));
setVisible(true);
}
}
这是我 运行 这个程序并单击按钮时得到的输出:
Setting new color to javax.swing.plaf.ColorUIResource[r=32,g=32,b=32] because old color was com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]
Setting new color to javax.swing.plaf.ColorUIResource[r=192,g=192,b=192] because old color was javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]
Setting new color to javax.swing.plaf.ColorUIResource[r=32,g=32,b=32] because old color was javax.swing.plaf.ColorUIResource[r=192,g=192,b=192]
Setting new color to javax.swing.plaf.ColorUIResource[r=192,g=192,b=192] because old color was javax.swing.plaf.ColorUIResource[r=32,g=32,b=32]
所以 UIManager 认为颜色在改变,但表观颜色 on-screen 没有改变。
任何建议表示赞赏。谢谢你的时间。
Is this an OS-dependent behavior somehow?
仅在 UI 委托控制组件外观的意义上,效果是 OS 相关的,并且每个支持的平台都定义了一个默认值 Look & Feel. On Mac OS X, the default is com.apple.laf.AquaLookAndFeel
; here is the corresponding source. As shown in UIManager Defaults, cited here,UIManager
"Button.background"
的键具有
com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]
但是分配的 space 完全被本机组件覆盖。类似的效果遮盖了为 "RadioBUtton.icon"
显示的浅粉色占位符。一些缓解策略:
按照建议here,您可以设置封闭的背景
JPanel
。按照建议 here,您可以使用
setOpaque()
为背景着色 一些;darker()
阴影可能会有帮助。JButton b = new JButton("Test"); b.setOpaque(true); b.setBackground(Color.red.darker());
如果使用
Border
,记得"put the component in aJPanel
and set the border on theJPanel
."使用控件,例如 here,让用户选择首选的外观;将选择保留在
java.util.prefs.Preferences
. 的实例中
将用户引导至 Mac OS X Accessibility 系统偏好设置面板中的对比度选项。
将特定于平台的代码包装在合适的谓词中。
if (System.getProperty("os.name").startsWith("Mac OS X")) { // Specific to Mac OS X }