5

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

谢谢!

4

1 回答 1

3

创建一个自定义 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);
        }
    }
}

结果如下: 在此处输入图像描述

该示例来自一本用于高级 java swing 的优秀书籍:Filthy Rich Clients https://github.com/romainguy/filthy-rich-clients/blob/master/Gradients/TwoStopsGradient/src/DepthButton.java

于 2016-11-28T00:37:11.807 回答