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));
那么按钮将保持默认颜色,而无需使用 setBackground
或 setContentAreaFilled
。
之所以调用 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.
我正在尝试了解 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));
那么按钮将保持默认颜色,而无需使用 setBackground
或 setContentAreaFilled
。
之所以调用 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.