Java 当我改变其中一些按钮的背景色而不是其他按钮的背景色时,如何使这些按钮看起来都一样?

Java 当我改变其中一些按钮的背景色而不是其他按钮的背景色时,如何使这些按钮看起来都一样?,java,swing,jbutton,look-and-feel,Java,Swing,Jbutton,Look And Feel,我有一个JFrame,我在上面放了几个JButton。一半的JButton都有颜色编码——也就是说,当X事件发生时,我把它们变成蓝色——我使用btn.setBackgroundColor(颜色)。当我使用setBackgroundColor时,我可以看到正常的JButtons有阴影/着色/一些使用setBackgroundColor的按钮没有的东西。我尝试过将颜色透明到有限的程度,但我仍然得到一块平坦的颜色,而不是着色按钮的着色版本 这似乎是一件很容易修复的事情,但它现在正困扰着我。我不想改变默

我有一个JFrame,我在上面放了几个JButton。一半的JButton都有颜色编码——也就是说,当X事件发生时,我把它们变成蓝色——我使用btn.setBackgroundColor(颜色)。当我使用setBackgroundColor时,我可以看到正常的JButtons有阴影/着色/一些使用setBackgroundColor的按钮没有的东西。我尝试过将颜色透明到有限的程度,但我仍然得到一块平坦的颜色,而不是着色按钮的着色版本

这似乎是一件很容易修复的事情,但它现在正困扰着我。我不想改变默认的LAF——这很好。我不想放弃颜色的改变。我确实希望所有按钮都显示为样式(我将用于HTML的单词)

所以我错过了一些东西…是什么

编辑以添加:

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”显示圆形/阴影/顶部带有红色色调的样式?或者我需要简单地把所有的按钮做成正方形,以获得统一的外观


谢谢

创建自定义JButton并覆盖绘制方法,如下图所示:

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);
        }
    }
}
结果如下:

这个例子来自一本关于高级JavaSwing的好书:肮脏的富客户端

发布您已经尝试过的代码,可能是您所说的“着色/着色/有挫折背景色的人所没有的东西”的图像,请看@mKorbel的答案。然后投票表决他的答案,因为它真的很神奇。再看看camickr的答案,我在看@mKorbel的答案。camickr的测试代码显示了与我在Windows和Java 7上看到的setBackgroundColor几乎相同的东西。对不起,我没有投票权。我确实多看了一些,现在正在看GradientPaint。实现起来很麻烦,但看起来我想要的是用渐变色覆盖paintComponent。亲爱的气垫船和Java Devil,是的——问题是当你设置背景色时——无论你是使用.setBackground(颜色)还是在它上面绘制矩形/形状——都(默认情况下)不使用渐变色。因此,在上面的示例中,42按钮具有渐变(着色/样式),因为在默认LAF中,它使用渐变绘制按钮。24按钮(至少在我的系统上默认)以普通的颜色显示颜色,而不是渐变。谢谢你给我指明了正确的方向。如果我有代表,我会投@mKorbel(和气垫船)的票。我试过了,它似乎在我的windows机器上工作。我使用了getBackground而不是新颜色(0xC8D2DE)