如何在更改某些JButton的背景颜色而不是其他颜色时使JButton看起来一样?

时间:2013-06-24 20:59:35

标签: java swing jbutton look-and-feel

我有一个JFrame,我正在放几个JButton。 JButton的一半有颜色编码 - 即。当X事件发生时我把它们变成蓝色 - 我使用btn.setBackgroundColor(Color)。当我使用setBackgroundColor时,我可以看到我看起来正常的JButton具有着色/着色/具有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);

在上面的示例中,“42”将在我的Windows机器上显示底部和顶部的轻微颜色变化,从而创建圆形和阴影效果。 “24”按钮将显示红色方块。我的问题是:有没有办法让“24”显示圆形/阴影/样式与顶部的红色色调?或者我是否需要简单地将所有按钮制成扁平方块以获得统一的外观?

谢谢!

1 个答案:

答案 0 :(得分: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摇摆书:肮脏的富客户端 https://github.com/romainguy/filthy-rich-clients/blob/master/Gradients/TwoStopsGradient/src/DepthButton.java