当我改变某些JButton的背景颜色而不改变其他按钮时,如何使所有JButton看起来相同?

5
我有一个JFrame,我在上面放置了几个JButton。其中一半的JButton具有颜色编码 - 即当发生X事件时,我将它们变成蓝色 - 我使用btn.setBackgroundColor(Color)。当我使用setBackgroundColor时,我可以看到普通JButton具有阴影/着色/某些东西,而具有setBackgroundColor的按钮则没有。我尝试使颜色透明到一定程度,但仍然得到一个平坦的颜色块,而不是带色调的阴影按钮。
这似乎应该是一个很容易解决的问题,但现在它正在困扰着我。我不想改变默认的LAF - 它很好。我不想放弃颜色更改。我确实希望所有按钮都显示出样式(我会用HTML中的“styled”这个词来形容)。
所以我现在缺少什么......是什么?
编辑后添加:
JFrame frame = new JFrame();
frame.add(new JButton("42"));
JButton btn24 = new JButton("24");
btn24.setBackground(Color.red);
frame.add(btn24);
frame.setVisible(true);

在上面的例子中,在我的Windows机器上,“42”将在底部和顶部显示略微不同的颜色,从而创建出一个圆形和阴影效果。 “24”按钮将显示一个红色正方形。我的问题是:有没有办法使“24”以红色色调显示出圆角/阴影/样式?还是我需要简单地将所有按钮制作成平面正方形,以获得统一的外观?
谢谢!

1
发布您已经尝试过的代码,以及“shading/coloring/something that the ones with the setBackgroundColor do not”所指的图像。 - Java Devil
2
看看@mKorbel的答案这里。然后给他点赞,因为它真的很棒。还要看看camickr的答案这里 - Hovercraft Full Of Eels
我正在查看@mKorbel的答案。camickr的测试代码显示了与Windows和Java 7中的setBackgroundColor几乎相同的内容。 - user2363027
抱歉...我没有足够的声望来点赞。我继续探索了一下,目前正在研究GradientPaint。虽然实现起来有些麻烦,但覆盖paintComponent并使用渐变颜色似乎是我想要的。 - user2363027
亲爱的 Hovercraft 和 Java Devil,是的,问题在于当您设置背景颜色时,无论您使用 .setBackground(Color) 还是在其上绘制矩形/形状,(默认情况下)不使用渐变。因此,在上面的示例中,42按钮具有渐变效果(阴影/样式),因为在默认 LAF 中,它使用渐变绘制按钮。至少在我的系统上,默认情况下,24按钮以纯色绘制--没有渐变。感谢您指导我正确方向。如果我有声望,我会为 @mKorbel(和Hovercraft)点赞。 - user2363027
你有几个选择。如果你的JButtons有文本,你可以改变文本的颜色。如果你的JButtons没有文本,你可以创建带有所需颜色的BufferedImages,并将其设置为JButton图标。 - Gilbert Le Blanc
1个回答

3
创建一个自定义的JButton,重写paint方法如下所示:
import static javax.swing.JFrame.EXIT_ON_CLOSE;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Test {

   public static void main(String[] args) {
    JButton btn24 = new DepthButton("24");
    JButton btn25 = new DepthButton("25");
    btn24.setBackground(Color.red);
    btn25.setBackground(Color.GREEN);

    JPanel pane = new JPanel(new BorderLayout());
    pane.add(new JButton("42"), BorderLayout.PAGE_START);

    pane.add(btn24, BorderLayout.PAGE_END);
    pane.add(btn25, BorderLayout.CENTER);

    frame.add(pane);
    frame.pack();
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setVisible(true);
    }

    /**
    *
    * @author Romain Guy
    */
    public static class DepthButton extends JButton {

        /** Creates a new instance of DepthButton */
        public DepthButton(String text) {
            super(text);
            setContentAreaFilled(false);
        }

        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g;

            GradientPaint p;
            p = new GradientPaint(0, 0, new Color(0xFFFFFF), 0, getHeight(), getBackground());

            Paint oldPaint = g2.getPaint();
            g2.setPaint(p);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.setPaint(oldPaint);

            super.paintComponent(g);
        }
    }
}

这是结果:

这里是结果: enter image description here

这个例子来自一本高级Java Swing的优秀书籍:Filthy Rich Clients https://github.com/romainguy/filthy-rich-clients/blob/master/Gradients/TwoStopsGradient/src/DepthButton.java


1
我尝试了一下,在我的Windows机器上似乎可以工作。我使用了getBackground而不是new Color(0xC8D2DE)。 - Sergej Werfel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接