1

我有一个带有图标的 JButton。我希望 JButton 的背景颜色与图标相同。

以下代码在标准外观中运行良好:

button.setBackground(new Color(212,208,199));

但是,当我将外观更改为 Nimbus 时,JButton 的背景颜色会变浅。

当我在 button.setBackground() 中更改颜色时,JButton 仍会更改其背景颜色,但我不知道在 Nimbus 中需要什么颜色才能获得与 JButton 的背景颜色相同的颜色。当然,我可以尝试通过尝试所有值来通过视觉找到颜色,但应该有更简单的方法。

我还尝试通过以下代码更改背景颜色,但结果相同:

UIDefaults defaults = UIManager.getLookAndFeelDefaults();
defaults.put("Button.background",new Color(212,208,199));

如何更改 Nimbus 中 JButton 的背景颜色,使其与包含图标的背景颜色合并?

下面是一些带有默认 LaF、nimbus LaF(相同代码)和 nimbus LaF(红色)的按钮的图片:

默认 LaF,使用button.setBackground(new Color(212,208,199))

在此处输入图像描述

Nimbus LaF,使用button.setBackground(new Color(212,208,199))

在此处输入图像描述

Nimbus LaF,使用button.setBackground(Color.red)

在此处输入图像描述

4

4 回答 4

3
  1. 请为什么Table.background改用Button.background

  2. 有关更多键以查看Nimbus 默认值

  3. 更多关于Nimbus 中 JButton 的背景

  4. 也许???(从你的描述中不知道),也许没有理由改变背景,必须看看 JButtons API

方法

 JButton.setBorderPainted(false);
 JButton.setBorder(null);
 JButton.setFocusable(false);
 JButton.setMargin(new Insets(0, 0, 0, 0));
 JButton.setContentAreaFilled(false);
 JButton.setIcon(someIcon);
 JButton.setRolloverIcon(someIcon);
 JButton.setPressedIcon(someIcon);
 JButton.setDisabledIcon(someIcon);
于 2013-02-19T16:06:34.063 回答
2

使用没有透明度的图像,“背景”将是图像 BG 中的任何颜色。

图标是 jpg 文件(没有透明度),但只填充了整个按钮的一部分。

有关如何获取与图标精确大小的按钮的提示,请参阅此问题。下图由 4 个按钮和 5 个标签组成,其中的图标是从单个图像中剪下的。

..图标下方的文本仍将显示按钮背景颜色..

啊对。文字亦然。

在这种情况下,最好的策略是从现有图像创建一个具有透明 BG的图像,然后在它提供的任何按钮(具有任何 GB 颜色)中使用它。

为此,请获取图像的 PNG(PNG 不像 JPG 那样有损),并使用专用的图像编辑器将其保存为透明的 BG。但是如果我们被迫在运行时这样做,考虑使用这样的东西:

图像背景清洁器

这张图片实际上展示了 JPG 的有损特性。我们必须与基本 BG 颜色越来越“远离”,以尝试拾取原始图标之外的所有像素。即使在对相似颜色的最宽松的解释中,我仍然看到一些我希望删除的斑点。

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.imageio.ImageIO;
import java.net.URL;

class ImageBackgroundCleaner {

    public static BufferedImage clearImageBackground(BufferedImage solidBG, int distance) {
        int w = solidBG.getWidth();
        int h = solidBG.getHeight();
        BufferedImage transparentBG = new BufferedImage(
                w,
                h,
                BufferedImage.TYPE_INT_ARGB);
        int c = solidBG.getRGB(0, 0);
        for (int xx=0; xx<w; xx++) {
            for(int yy=0; yy<h; yy++) {
                int s = solidBG.getRGB(xx, yy);
                if (getColorDistance(s,c)>=distance) {
                    transparentBG.setRGB(xx, yy, s);
                }
            }
        }
        return transparentBG;
    }

    public static int getColorDistance(int color1, int color2) {
        Color c1 = new Color(color1);
        Color c2 = new Color(color2);
        int r1 = c1.getRed();
        int g1 = c1.getGreen();
        int b1 = c1.getBlue();
        int r2 = c2.getRed();
        int g2 = c2.getGreen();
        int b2 = c2.getBlue();

        return Math.abs(r1-r2) + Math.abs(g1-g2) + Math.abs(b1-b2);
    }

    public static void main(String[] args) throws Exception {
        URL url = new URL("http://i.stack.imgur.com/Yzfbk.png");
        BufferedImage bi = ImageIO.read(url);
        final BufferedImage img = bi.getSubimage(39, 21, 40, 40);
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(3,0,5,5));
                gui.setBackground(Color.RED);

                JLabel original = new JLabel(new ImageIcon(img));
                gui.add(original);

                int start = 12;
                int inc = 3;
                for (int ii=start; ii<start+(8*inc); ii+=inc) {
                    gui.add(new JLabel(new ImageIcon(clearImageBackground(img, ii))));
                }

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html
        SwingUtilities.invokeLater(r);
    }
}
于 2013-02-20T01:04:08.137 回答
0

这个问题仍然困扰着我,因为我想知道为什么 nimbus 会改变 setBackground() 的结果......我假设 nimbus 应用了某种颜色蒙版,它会稍微改变颜色?

但是:在我的项目中,按钮都在一个单独的 JPanel 中,需要 nimbus LaF 的 Jpanel 没有任何按钮,所以我通过使用按钮 JPanel 的默认 LaF 解决了这个问题,并且只使用了 nimbus LaF在我需要它的 JPanel 中。

抱歉,我之前没有想到这一点(我不知何故认为 LaF 必须适用于整个项目)。

所以问题解决了,但仍然对关于 nimbus 颜色处理的答案感到好奇....

于 2013-02-20T06:57:42.883 回答
0
// you can always try this, it worked for me 
button.setContentAreaFilled(false);
button.setOpaque(true);
于 2018-05-21T04:05:21.863 回答