使用 Nimbus LaF 按下时 JButton 不会使图标变暗
JButton doesn't darken icon when pressed with Nimbus LaF
我创建了一些只有图像可见的按钮:
public static JButton createImageButton(ImageIcon image) {
JButton btn = new JButton(image);
btn.setContentAreaFilled(false);
btn.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
return btn;
}
这给了我以下输出:
按下按钮时我通常得到:
但是当我将 LaF 更改为 Nimbus 时,就不会发生这种情况。
是否可以将 Nimbus 配置为在按下按钮时使图标变暗?
我已经尝试过像这样更改一些按钮默认设置:
UIManager.getLookAndFeelDefaults()
.put("Button[Pressed].backgroundPainter", new CustomPainter());
但我不确定如何写 CustomPainter
class 或者这是否完全解决了问题...
通过查看 Aqua LaF 的源代码解决了问题 (GitHub)
我找到了一个合适的方法,并基于这个方法对我的源代码进行了如下调整:
public static JButton createImageButton(ImageIcon image) {
JButton btn = new JButton(image);
btn.setContentAreaFilled(false);
btn.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
btn.setPressedIcon(new ImageIcon(generatePressedDarkImage(image.getImage())));
return btn;
}
private static Image generatePressedDarkImage(final Image image) {
final ImageProducer prod = new FilteredImageSource(image.getSource(), new RGBImageFilter() {
@Override
public int filterRGB(int x, int y, int rgb) {
final int red = (rgb >> 16) & 0xff;
final int green = (rgb >> 8) & 0xff;
final int blue = rgb & 0xff;
final int gray = (int)((0.30 * red + 0.59 * green + 0.11 * blue) / 4);
return (rgb & 0xff000000) | (grayTransform(red, gray) << 16) | (grayTransform(green, gray) << 8) | (grayTransform(blue, gray) << 0);
}
private int grayTransform(final int color, final int gray) {
int result = color - gray;
if (result < 0) result = 0;
if (result > 255) result = 255;
return result;
}
});
return Toolkit.getDefaultToolkit().createImage(prod);
}
这为我提供了一种使图像变暗的通用方法,其方式与默认情况下 Aqua LaF 使图像变暗的方式相同:
我创建了一些只有图像可见的按钮:
public static JButton createImageButton(ImageIcon image) {
JButton btn = new JButton(image);
btn.setContentAreaFilled(false);
btn.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
return btn;
}
这给了我以下输出:
按下按钮时我通常得到:
但是当我将 LaF 更改为 Nimbus 时,就不会发生这种情况。
是否可以将 Nimbus 配置为在按下按钮时使图标变暗?
我已经尝试过像这样更改一些按钮默认设置:
UIManager.getLookAndFeelDefaults()
.put("Button[Pressed].backgroundPainter", new CustomPainter());
但我不确定如何写 CustomPainter
class 或者这是否完全解决了问题...
通过查看 Aqua LaF 的源代码解决了问题 (GitHub)
我找到了一个合适的方法,并基于这个方法对我的源代码进行了如下调整:
public static JButton createImageButton(ImageIcon image) {
JButton btn = new JButton(image);
btn.setContentAreaFilled(false);
btn.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
btn.setPressedIcon(new ImageIcon(generatePressedDarkImage(image.getImage())));
return btn;
}
private static Image generatePressedDarkImage(final Image image) {
final ImageProducer prod = new FilteredImageSource(image.getSource(), new RGBImageFilter() {
@Override
public int filterRGB(int x, int y, int rgb) {
final int red = (rgb >> 16) & 0xff;
final int green = (rgb >> 8) & 0xff;
final int blue = rgb & 0xff;
final int gray = (int)((0.30 * red + 0.59 * green + 0.11 * blue) / 4);
return (rgb & 0xff000000) | (grayTransform(red, gray) << 16) | (grayTransform(green, gray) << 8) | (grayTransform(blue, gray) << 0);
}
private int grayTransform(final int color, final int gray) {
int result = color - gray;
if (result < 0) result = 0;
if (result > 255) result = 255;
return result;
}
});
return Toolkit.getDefaultToolkit().createImage(prod);
}
这为我提供了一种使图像变暗的通用方法,其方式与默认情况下 Aqua LaF 使图像变暗的方式相同: