使用Nimbus LaF按下时,JButton不会使图标变暗

时间:2016-09-02 16:58:31

标签: java swing jbutton imageicon nimbus

我创建了一些只显示图像的按钮:

public static JButton createImageButton(ImageIcon image) {
    JButton btn = new JButton(image);
    btn.setContentAreaFilled(false);
    btn.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    return btn;
}

这给了我以下输出:

enter image description here

按下按钮时,我通常会得到:

enter image description here

但是当我将LaF改为Nimbus时,这种情况不会发生。

是否有可能在按下按钮的同时配置Nimbus以使图标变暗?

我已经尝试更改一些按钮默认值,如下所示:

UIManager.getLookAndFeelDefaults()
.put("Button[Pressed].backgroundPainter", new CustomPainter());

但是我不确定如何写一个CustomPainter课程,或者这根本解决了这个问题......

1 个答案:

答案 0 :(得分:0)

通过查看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默认使它们变暗一样:

enter image description here