【问题标题】:How do I make the JButtons all look the same when changing background color on some of them and not on others?在更改其中一些而不是其他的背景颜色时,如何使 JButton 看起来都一样?
【发布时间】:2013-06-21 12:32:13
【问题描述】:

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

谢谢!

【问题讨论】:

  • 发布您已经尝试过执行此操作的代码,并可能通过“着色/着色/具有 setBackgroundColor 的那些没有的东西”来说明您的意思
  • 看看@mKorbel 的回答here。然后投票赞成他的答案,因为这真的很棒。另请查看 camickr 的回答here
  • 我正在查看@mKorbel 的答案。 camickr 的测试代码显示的内容与我在 Windows 和 Java 7 中使用 setBackgroundColor 看到的内容几乎相同。
  • 对不起...我没有代表支持。我确实四处闲逛,目前正在研究 GradientPaint。实现起来很麻烦,但看起来我想要用渐变绘制覆盖paintComponent。
  • 亲爱的 Hovercraft 和 Java Devil,是的——问题是当你设置背景颜色时——无论是使用 .setBackground(Color) 还是在其上方绘制矩形/形状——都没有t(默认)使用渐变。因此,在上面的示例中,42 按钮具有渐变(阴影/样式),因为在默认 LAF 中,它使用渐变绘制按钮。 24 按钮(至少在我的系统上是默认的)以普通颜料显示颜色——而不是渐变。感谢您为我指明正确的方向。如果我有代表,我会为@mKorbel(和气垫船)投票。

标签: java swing jbutton look-and-feel


【解决方案1】:

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

结果如下:

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

【讨论】:

  • 我试过了,它似乎可以在我的 Windows 机器上运行。我使用 getBackground 而不是 new Color(0xC8D2DE)
猜你喜欢
  • 2016-03-27
  • 2019-11-04
  • 2011-01-28
  • 2014-05-11
  • 2016-05-08
  • 2020-12-06
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多