克隆摇摆组件中的背景颜色

时间:2016-05-29 04:26:59

标签: java swing colors clone

将两种显然相同的颜色应用于两个JButton会产生不同的结果:

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

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

结果如下:

enter image description here

我知道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);
        }
    }

2 个答案:

答案 0 :(得分:1)

默认背景实际上是ColorUIResource对象。

用这个改回你的按钮:

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

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

答案 1 :(得分:1)

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

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