PLAF无法改变按钮颜色

时间:2015-04-27 19:46:42

标签: java swing colors look-and-feel

我们有一个程序可以在“白天”(高对比度)和“夜间”(低对比度)模式之间切换。这是通过动态改变外观来完成的。它几乎适用于所有组件,但有些组件忽略了背景颜色的变化。特别是,我注意到按钮,组合框和表头都忽略了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认为颜色正在变化,但屏幕上的表观颜色不会改变。

任何建议表示赞赏。谢谢你的时间。

1 个答案:

答案 0 :(得分:3)

  

这是一种依赖操作系统的行为吗?

仅在UI委托控制组件外观的意义上,效果取决于操作系统,每个支持的平台定义默认Look & Feel。在Mac OS X上,默认值为com.apple.laf.AquaLookAndFeel;这是相应的source。如 UIManager Defaults 所示,引用hereUIManager的{​​{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