我有一个带有图标的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)
:
答案 0 :(得分:3)
请Table.background
使用Button.background
代替
了解更多密钥以查看Nimbus Default
maybe??? (no idea from your descriptions),也许没有理由改变背景,必须look at 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);
答案 1 :(得分:2)
使用没有透明度的图像,“背景”将是图像背景中的任何颜色。
图标是jpg文件(没有透明度)但只填充整个按钮的一部分..
有关如何获取图标大小的按钮的提示,请参阅this question。下图由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);
}
}
答案 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);