Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 克隆swing组件中的背景色_Java_Swing_Colors_Clone - Fatal编程技术网

Java 克隆swing组件中的背景色

Java 克隆swing组件中的背景色,java,swing,colors,clone,Java,Swing,Colors,Clone,将明显相同的颜色应用于两个JButton,会产生不同的结果: Color colorA = panel.getBackground(); btnA.setBackground(colorA); Color colorB = new Color(panel.getBackground().getRGB()); btnB.setBackground(colorB); 结果如下所示: 我知道color

将明显相同的颜色应用于两个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);
        }
    }

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

用以下命令更改按钮:

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

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

两者之间的区别在于
面板返回的颜色。getBackground()
颜色的子类的一个实例,它实现了
UIResource
。这是一个特殊的类,用于处理Java中的外观,而不是像常规颜色那样处理


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

:感谢您的回复。添加btnB.setBackground(新的ColorUIResource(Color.BLACK));将使btnB看起来像btnA。我的问题是为什么它们看起来不同,而不是如何“修复”它。这并不是说btnA是好的,btnB是错的。但我告诉过你。ColorUIResource对象将使用Java运行时中指定的外观。这在别处控制,默认情况下配置为渐变效果。它们看起来不同,因为btnB设置为纯色背景色。谢谢。现在我理解了
System.out.println(colorA.getClass())返回
java.awt.Color
ColorUIResource的colorA实例
返回
false