Изменение значений ключа по умолчанию для JButton в Nimbus LaF

У меня есть две кнопки в моей программе

JButton button1 = new JButton();
button1.setText("First Button");
JButton button2 = new JButton("Second Button");

Я попытался изменить LaF кнопки, я могу изменить цвет фона кнопки, используя следующий код

UIManager.put(Button.background new color(134,201,236));

Но когда я попытался изменить другие значения ключей, такие как "Button.disabled", "Button[Default+Focused+Pressed].backgroundPainter", код у меня не сработал. Может ли кто-нибудь помочь мне, как изменить значения ключей по умолчанию, которые использует Painter?


person user3792685    schedule 01.07.2014    source источник


Ответы (1)


Должен любить Нимбус.

Хорошо, для начала, вы захотите, чтобы эти значения были близкими...

Button.background = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223
Button.contentMargins = javax.swing.plaf.InsetsUIResource[top=6,left=14,bottom=6,right=14]
Button.defaultButtonFollowsFocus = false
Button.disabled = DerivedColor(color=214,217,223 parent=control offsets=0.0,0.0,0.0,0 pColor=214,217,223
Button.disabledText = DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145
Button.focusInputMap = javax.swing.plaf.InputMapUIResource@70e4bd3a
Button.font = javax.swing.plaf.FontUIResource[family=SansSerif,name=sansserif,style=plain,size=12]
Button.foreground = DerivedColor(color=0,0,0 parent=text offsets=0.0,0.0,0.0,0 pColor=0,0,0
ButtonUI = javax.swing.plaf.synth.SynthLookAndFeel
Button[Default+Focused+MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@3e5d2085
Button[Default+Focused+Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@78662669
Button[Default+Focused].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@2988e80b
Button[Default+MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@7c508d6d
Button[Default+Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@2b5ec36a
Button[Default+Pressed].textForeground = DerivedColor(color=255,255,255 parent=nimbusSelectedText offsets=0.0,0.0,0.0,0 pColor=255,255,255
Button[Default].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@62c2ed06
Button[Disabled].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@c6499e5
Button[Disabled].textForeground = DerivedColor(color=142,143,145 parent=nimbusDisabledText offsets=0.0,0.0,0.0,0 pColor=142,143,145
Button[Enabled].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@742746e1
Button[Focused+MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@293f9e9c
Button[Focused+Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@5ce0ec60
Button[Focused].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@7463fda8
Button[MouseOver].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@3a3dad8b
Button[Pressed].backgroundPainter = javax.swing.plaf.nimbus.ButtonPainter@6f231f2e

Это в основном ключи/значения по умолчанию, используемые Nimbus для рисования стандартной кнопки...

По сути, вам нужно предоставить свой собственный Painter, например...

public class ButtonPainter implements Painter {

    private Color light, dark;
    private GradientPaint gradPaint;

    public ButtonPainter(Color light, Color dark) {
        this.light = light;
        this.dark = dark;
    }

    @Override
    public void paint(Graphics2D g, Object c, int w, int h) {
        System.out.println("...");
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f), (h / 2.0f), dark, true);
        g.setPaint(gradPaint);
        g.fillRect(2, 2, (w - 5), (h - 5));

        Color outline = new Color(0, 85, 0);
        g.setColor(outline);
        g.drawRect(2, 2, (w - 5), (h - 5));
        Color trans = new Color(outline.getRed(), outline.getGreen(), outline.getBlue(), 100);
        g.setColor(trans);
        g.drawRect(1, 1, (w - 3), (h - 3));
    }
}

А затем замените значения UIManager

UIManager.getLookAndFeelDefaults().put("Button[Enabled].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED));
UIManager.getLookAndFeelDefaults().put("Button[Focused].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED));

Например...

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.Painter;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.ColorUIResource;

public class TestNimbus {

    public static void main(String[] args) {
        new TestNimbus();
    }

    public TestNimbus() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                System.out.println(UIManager.get("Button[Default+Focused].backgroundPainter"));

                UIManager.getLookAndFeelDefaults().put("Button[Enabled].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED));
                UIManager.getLookAndFeelDefaults().put("Button[Focused].backgroundPainter", new ButtonPainter(Color.YELLOW, Color.RED));

                System.out.println(UIManager.get("Button[Default+Focused].backgroundPainter"));


                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());
                frame.add(new JButton("First Button"));
                frame.add(new JButton("Second Button"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ButtonPainter implements Painter {

        private Color light, dark;
        private GradientPaint gradPaint;

        public ButtonPainter(Color light, Color dark) {
            this.light = light;
            this.dark = dark;
        }

        @Override
        public void paint(Graphics2D g, Object c, int w, int h) {
            System.out.println("...");
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            gradPaint = new GradientPaint((w / 2.0f), 0, light, (w / 2.0f), (h / 2.0f), dark, true);
            g.setPaint(gradPaint);
            g.fillRect(2, 2, (w - 5), (h - 5));

            Color outline = new Color(0, 85, 0);
            g.setColor(outline);
            g.drawRect(2, 2, (w - 5), (h - 5));
            Color trans = new Color(outline.getRed(), outline.getGreen(), outline.getBlue(), 100);
            g.setColor(trans);
            g.drawRect(1, 1, (w - 3), (h - 3));
        }
    }

}

Это глобальное изменение, поэтому оно затронет все кнопки. Я считаю, что есть способ сделать так, чтобы только те элементы управления, которые вы хотите изменить, могли быть затронуты, но вам нужно будет провести дополнительное исследование этого самостоятельно;)

person MadProgrammer    schedule 01.07.2014
comment
Должен любить Nimbus. Я думаю, что часть «Должна быть» спорна. Я рассматривал комбо-чейнджер PLAF. который отфильтровывает Nimbus. ;) - person Andrew Thompson; 01.07.2014
comment
@AndrewThompson Лично я считаю, что система выглядит и ощущается в большинстве ситуаций, пользователи, кажется, лучше ее принимают - ИМХО - person MadProgrammer; 01.07.2014
comment
Да, системный PLAF был бы моим первым выбором по умолчанию для приложения. Если они хотят пофантазировать, я бы посмотрел на JGoodies PLAF, которые, как мне кажется, чистые и тонкие. - person Andrew Thompson; 01.07.2014
comment
После некоторого тестирования у меня появились новые сомнения, связанные с приведенным выше кодом. 1. Можно ли указать только один цвет для класса ButtonPainter? 2. Можно ли получить закругленный прямоугольник для нового цвета, потому что форма кнопки по умолчанию в Nimbus имеет закругленные края. Если это возможно, не могли бы вы предоставить мне код? @MadProgrammer - person user3792685; 04.07.2014
comment
1- Да, 2- Да. Вы контролируете весь процесс покраски. Вы можете взломать src.zip в вашем каталоге JDK и посмотреть, как это делает Nimbus. - person MadProgrammer; 04.07.2014
comment
Вы имеете в виду проверить ButtonPainter.java? Что касается первого вопроса, GradientPaint() в коде использует два цвета в реализации. какие другие методы я должен использовать для моего собственного художника? @MadProgrammer - person user3792685; 04.07.2014
comment
Вы можете делать все, на что способен Graphics2D API, setColor и fillRect приходят на ум - person MadProgrammer; 04.07.2014
comment
большое вам спасибо за вашу помощь. Мне удалось решить проблему @MadProgrammer - person user3792685; 04.07.2014