JButton 后台行为未清除

JButton background behavior isn't cleared

我正在尝试了解 JButton 行为。当我使用 FlowLayout 布局向 JFrame 添加按钮时,该按钮显示为蓝色,尽管当我调用 button.getBackground 时,我看到它 returns a灰色(与 JFrame-容器背景完全相同的 RGB 颜色)。我读到有一种方法 getContentAreaFilled 也会影响按钮颜色。

如果我将 contentAreaFilled 设置为 false,我真的会得到一个灰色按钮。 但是,我还注意到,如果我将按钮背景设置为任何颜色,那么 ContentAreaFilled 颜色就不再重要了。我想了解它是如何工作的?为什么当背景颜色没有改变时(setBackground 方法没有被按钮调用),contentAreaFilled 颜色在背景按钮颜色上占主导地位,而当设置 JButton 时,背景比 contentAreaFilled 颜色占主导地位。 另外 setOpaque(false) 方法仅在调用 setBackground 方法时影响按钮背景颜色,否则 setOpaque(false) 什么都不做,只有 ContentAreaFilled 才是重要的

public class ButtonTest extends JFrame
{
   public static void main( String[] args )
   { 

      JButton justButton= new JButton("Just a Button");
    //  justButton.setBackground(Color.GREEN); //this line is critical
      System.out.println("Button color is:"+ justButton.getBackground()+"\n");
      ButtonTest frame= new ButtonTest();
      frame.setLayout(new FlowLayout());
      frame.add(justButton);
      frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      frame.setSize( 275, 110 ); // set frame size
      frame.setVisible( true ); // display frame
      System.out.println("Frame background is:"+frame.getBackground()+"\n");
      System.out.println("getContentPane color 
       is:"+frame.getContentPane().getBackground()+"\n");
       System.out.println(justButton.isOpaque()+ "  " + 
        justButton.isContentAreaFilled());
   }
}

如果我不设置不同的按钮背景,我希望 JBbutton 颜色为灰色(默认值为 JButton 背景色)。 另外我希望 setOpaque 方法会影响 JButton 背景透明,无论 setBackground 方法调用如何

您观察到按钮 "blue" 颜色的原因是使用中的可插入 look-and-feel (PLAF) 添加了渐变或其他效果。颜色实际上是灰色的,但是渐变使它看起来是蓝色的。我猜你用的是Metal PLAF,有这个效果。

如果将按钮的 UI 替换为 non-PLAF UI:

justButton.setUI((ButtonUI)BasicButtonUI.createUI(justButton));

那么按钮将保持默认颜色,而无需使用 setBackgroundsetContentAreaFilled

之所以调用 setBackground 具有消除渐变或其他特殊效果的效果,是因为各个 LAF 对背景颜色的处理方式不同。 Metal LAF 完全消除了这种影响。 windows 系统 LAF 实际上忽略了背景颜色,只显示带有颜色的细边框。请注意 JComponent.sebBackground:

的文档

It is up to the look and feel to honor this property, some may choose to ignore it.