我们有一个程序可以在“白天”(高对比度)和“夜间”(低对比度)模式之间切换。这是通过动态改变外观来完成的。它几乎适用于所有组件,但有些组件忽略了背景颜色的变化。特别是,我注意到按钮,组合框和表头都忽略了PLAF的变化。
这是一个带按钮的示例程序。难道我做错了什么?这是一种依赖操作系统的行为吗? (我在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);
}
}
这是我运行此程序并单击按钮时得到的输出:
将新颜色设置为javax.swing.plaf.ColorUIResource [r = 32,g = 32,b = 32],因为旧颜色为com.apple.laf.AquaImageFactory $ SystemColorProxy [r = 238,g = 238,b = 238]
将新颜色设置为javax.swing.plaf.ColorUIResource [r = 192,g = 192,b = 192],因为旧颜色为javax.swing.plaf.ColorUIResource [r = 32,g = 32,b = 32 ]
将新颜色设置为javax.swing.plaf.ColorUIResource [r = 32,g = 32,b = 32],因为旧颜色为javax.swing.plaf.ColorUIResource [r = 192,g = 192,b = 192 ]
将新颜色设置为javax.swing.plaf.ColorUIResource [r = 192,g = 192,b = 192],因为旧颜色为javax.swing.plaf.ColorUIResource [r = 32,g = 32,b = 32 ]
所以UIManager认为颜色正在变化,但屏幕上的表观颜色不会改变。
任何建议表示赞赏。谢谢你的时间。
答案 0 :(得分:3)
这是一种依赖操作系统的行为吗?
仅在UI委托控制组件外观的意义上,效果取决于操作系统,每个支持的平台定义默认Look & Feel。在Mac OS X上,默认值为com.apple.laf.AquaLookAndFeel
;这是相应的source。如 UIManager Defaults 所示,引用here,UIManager
的{{1}}键的亮灰色值为
"Button.background"
但是分配的空间完全被本机组件覆盖。类似的效果掩盖了为com.apple.laf.AquaImageFactory$SystemColorProxy[r=238,g=238,b=238]
显示的浅粉色占位符。一些缓解策略:
根据建议here,您可以设置封闭"RadioBUtton.icon"
的背景。
根据建议here,您可以使用JPanel
为某些背景提供 。 setOpaque()
阴影可能会有所帮助。
darker()
如果您使用Border
,请记住“将该组件放在JButton b = new JButton("Test");
b.setOpaque(true);
b.setBackground(Color.red.darker());
中并在JPanel
上设置边框。”
使用诸如here之类的控件,让用户选择首选的Look&感觉;将选项保留在JPanel
。
将用户定向到Mac OS X Accessibility系统偏好设置面板中的对比度选项。
将特定于平台的代码包装在合适的谓词中。
java.util.prefs.Preferences