Nimbus外观改变了JButton的颜色

时间:2013-02-19 15:22:50

标签: java swing jbutton look-and-feel nimbus

我有一个带有图标的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))

enter image description here

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

enter image description here

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

enter image description here

4 个答案:

答案 0 :(得分:3)

  1. Table.background使用Button.background代替

  2. 了解更多密钥以查看Nimbus Default

  3. 有关Background for JButton in Nimbus

  4. 的更多信息
  5. maybe??? (no idea from your descriptions),也许没有理由改变背景,必须look at JButtons API

  6. 方法

     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);
    

答案 1 :(得分:2)

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

  

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

有关如何获取图标大小的按钮的提示,请参阅this question。下图由4个按钮和5个标签组成,图标从单个图像中剪切。

  

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

哦对。文字也是。

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

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

Image Background Cleaner

这张图片实际上展示了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);
    }
}

答案 2 :(得分:0)

这个问题仍然在思考我,因为我想知道为什么nimbus会改变setBackground()的结果......我假设nimbus会应用某种颜色的蒙版,这会略微改变颜色?

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

对不起,我之前没有想到这一点(我不知怎的假设LaF必须申请整个项目)。

问题解决了,但仍然对有关雨云颜色处理的答案感到好奇....

答案 3 :(得分:0)

// you can always try this, it worked for me 
button.setContentAreaFilled(false);
button.setOpaque(true);