如何设置JButton的按钮颜色(不是背景颜色)

我有一个JButton ,我想将背景颜色改为白色。 使用Metal Look And Feel时,我使用setBackground实现了所需的效果:

金属外观和风格JButton与白色背景

不幸的是,使用Windows LAF时“背景颜色”的概念是不同的; 背景颜色是按钮周围绘制的颜色:

Windows外观风格的JButton,白色背景

我想使用Windows LAF,但允许将此JButton的按钮颜色更改为白色。 我该怎么做呢?

您必须决定是否值得付出努力,但您始终可以创建自己的ButtonUI ,如本例所示,由于@mKorbel。

我在XP上使用JDK 6。 看起来Window UI不会遵循正常的绘制规则,而不是1.正如您所注意到的,setBackground()不起作用。 您应该能够通过告诉组件不要填写内容区域来进行自定义绘制:

 import java.awt.*; import javax.swing.*; public class ButtonBackground extends JFrame { public ButtonBackground() { setLayout( new FlowLayout() ); JButton normal = new JButton("Normal"); add(normal); JButton test1 = new JButton("Test 1") { @Override public void paintComponent(Graphics g) { g.setColor( Color.GREEN ); g.fillRect(0, 0, getSize().width, getSize().height); super.paintComponent(g); } }; test1.setContentAreaFilled(false); add(test1); } public static void main(String[] args) { try { // UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); } catch (Exception e2) {} ButtonBackground frame = new ButtonBackground(); frame.setDefaultCloseOperation( EXIT_ON_CLOSE ); frame.pack(); frame.setLocationRelativeTo( null ); frame.setVisible(true); } } 

当您运行代码时,它似乎正常工作。 也就是说,当您单击按钮时,您会看到边框更改。 但是,如果您使用Windows XP LAF运行,边框永远不会更改为您没有看到按钮单击效果。

因此,我想问题是WindowUI,你需要自定义UI,这可能太复杂了,所以我没有解决方案。

但我仍然认为(由Darryl修改)是正确的UIManager.get(“Button.gradient”) ,因为它将是跨平台的

编辑:正确的答案是 – Nimbus或一些自定义L&F ,为什么重新发明轮子(由Rob)

您最好的选择是使用SwingX:

JXButton允许您使用.setBackgroundPainter(Painter)为背景设置一个Painter,使用MattePainter可以达到您想要的效果。 让JXButton从JButton扩展,代码中的更改很少:

 Color bg = new Color(new Random().nextInt(16777215)); // Random color JButton button = new JButton(); button.setBackground(bg); 

会成为

 JXButton button = new JXButton(); button.setBackgroundPainter(new MattePainter(bg)); 

而不是弄乱按钮的背景颜色,你可以做任何表明你试图以不同的方式表示?

显示一个图标,使按钮变为粗体而不是纯文本等。

仅通过不同的背景颜色指示某些东西并不总是显而易见的,并且取决于用户的系统颜色,可能是刺耳的或不可见的。

例如,如果用户以“高对比度”模式运行窗口该怎么办?