【问题标题】:Clone background color in a swing component在 Swing 组件中克隆背景颜色
【发布时间】:2016-05-29 04:26:58
【问题描述】:

对两个 JButton 应用明显相同的颜色会产生不同的结果:

            Color colorA = panel.getBackground();
            btnA.setBackground(colorA);

            Color colorB = new Color(panel.getBackground().getRGB());
            btnB.setBackground(colorB);

结果如下所示:

我知道 colorA 是对 panel.getBackground() 的引用,而 colrB 是一个新的颜色对象,但两者具有相同的 rgb 值:

颜色 A RGB 为 238/238/238
颜色 B RGB 为 238/238/238

我不明白为什么两个相似的按钮显示不同的背景颜色。

这是一个完整的工作代码:

    public class Test {

        public static void main(String[] args)  {

            JFrame jf = new JFrame("Why are the colors different ?");
            jf.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            jf.getContentPane().setBackground(Color.WHITE);
            jf.setPreferredSize(new Dimension(400,100));
            Dimension size = new Dimension(125, 25);

            JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER,15, 15));
            jf.getContentPane().add(panel);

            JButton btnA = new JButton("A");
            btnA.setPreferredSize(size);
            panel.add(btnA);

            JButton btnB = new JButton("B");
            btnB.setPreferredSize(size);
            panel.add(btnB);

            //-- apply background color to buttons
            Color colorA = panel.getBackground();
            btnA.setBackground(colorA);
            Color colorB = new Color(colorA.getRGB());
            btnB.setBackground(colorB);

            jf.validate();
            jf.pack();
            jf.setVisible(true);
        }
    }

【问题讨论】:

    标签: java swing colors clone


    【解决方案1】:

    两者的区别在于panel.getBackground()返回的颜色是javax.swing.plaf.ColorUIResource的一个实例,Color的子类实现了UIResource。这是一个特殊的类,用于处理 Java 中的外观,而不是像常规颜色一样处理。

    事实上,ColorUIResource 的值是什么并不重要;任何 rgb 值都以相同的方式呈现,由外观决定,这将使用它自己的自定义呈现覆盖颜色。

    【讨论】:

    • 谢谢。现在我明白了
    • System.out.println(colorA.getClass()); 返回java.awt.ColorcolorA instanceof ColorUIResource 返回false
    【解决方案2】:

    默认背景其实是ColorUIResource对象。

    用这个改变你的按钮:

    button.setBackground(new ColorUIResource(Color.BLACK));
    

    您指定的颜色无关紧要。 ColorUIResource 对象将使用当前的外观。默认情况下,这设置为产生您看到的渐变效果。

    【讨论】:

    • :感谢您的回复。添加 btnB.setBackground(new ColorUIResource(Color.BLACK));将使 btnB 看起来像 btnA。我的问题是为什么它们看起来不同,而不是如何“修复”它。并不是说btnA没问题,btnB错了。
    • 但我告诉过你。 ColorUIResource 对象将使用 Java 运行时中指定的外观。这是在其他地方控制的,默认配置为渐变效果。它们看起来不同,因为 btnB 设置为纯色背景。
    猜你喜欢
    • 2012-04-16
    • 2012-02-17
    • 2018-01-22
    • 2020-01-17
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2018-12-28
    相关资源
    最近更新 更多