JButton не затемняет значок при нажатии с 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 класс или если это решает проблему вообще...

1 ответ

Решение

Решил проблему, посмотрев на исходный код 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 затемняет их по умолчанию:

Другие вопросы по тегам