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


person Marek    schedule 02.09.2016    source источник
comment
для лучшей помощи скорее опубликуйте MCVE / SSCCE, короткий, работоспособный, компилируемый с помощью встроенного Icons в JVM, например. private Icon loadIcon = UIManager.getIcon("OptionPane.errorIcon");   -  person mKorbel    schedule 02.09.2016
comment
While pressing the button I usually get и But when I change the LaF to Nimbus, this won't happen., эта функциональность одинакова (Mouse и KeyEvent в JButton / AbstractButton), используя все стандартные L&F в Win OS, не имеет значения, есть ли backgroundPainter или нет, голосование за закрытие тоже   -  person mKorbel    schedule 02.09.2016
comment
Создайте затемненный значок и установите для нажатого значка JButton этот значок. См. stackoverflow.com/questions/12468203/   -  person copeg    schedule 02.09.2016
comment
@copeg да, я, наверное, пойду на это. Хотя я надеялся, что будет более общий способ решить проблему   -  person Marek    schedule 02.09.2016


Ответы (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 затемняет их по умолчанию:

введите здесь описание изображения

person Marek    schedule 02.09.2016