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

时间:2011-06-06 18:37:31

标签: java swing jbutton

我有JButton我希望将背景颜色更改为白色。使用金属外观时,我使用setBackground

达到了预期的效果

Metal look-and-feel-styled JButton with a white background

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

Windows look-and-feel-styled JButton with a white background

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

我在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,因此我没有解决方案。

答案 2 :(得分:1)

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

编辑:正确的答案是 - Nimbus还是一些Custom L&F,为什么重新发明轮子(由Rob)

答案 3 :(得分:1)

您最好的选择是使用SwingX:

JXButton允许您使用MattePainter为.setBackgroundPainter(Painter)设置背景画家,以达到您想要的效果。让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));

答案 4 :(得分:0)

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

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

仅通过不同的背景颜色指示某些内容并不总是显而易见的,并且根据用户的系统颜色,可能会出现震动或不可见。

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