With Nimbus, make control background color yellow only when control has focus?

混江龙づ霸主 提交于 2019-12-01 18:51:30

问题


This seems like it should be straightforward, but I haven't found a "good" way to do it...

While using the Swing Nimbus L&F, I want to give my controls (JButtons, JTextField, etc...) a yellow background color when they have focus. Other than the yellow background color, I want them to keep all the usual Nimbus styling.

When not focused, I want them to be drawn with the normal Nimbus styling.

The only way I've found to do this is to rewrite the control[Focused].backgroundPainter for every single control (which would amount to rewriting a large part of Nimbus from scratch).

Am I missing something? Thanks!


回答1:


Nimbus Default provide simple matrix for Nimbus Look and Feel, but required to override all related Mouse and Focus events, without overriding ... could be only,

from code

import com.sun.java.swing.Painter;
import java.awt.*;
import javax.swing.*;

public class NimbusJPanelBackGround {

    public NimbusJPanelBackGround() {
        JButton btn = new JButton("  Whatever  ");
        JButton btn1 = new JButton("  Whatever  ");
        JPanel p = new JPanel();
        p.add(btn);
        p.add(btn1);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.add(p, BorderLayout.CENTER);
        f.pack();
        f.setLocation(150, 150);
        f.setVisible(true);
    }

    public static void main(String[] args) {

        try {
            for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(laf.getName())) {
                    UIManager.setLookAndFeel(laf.getClassName());
                    UIManager.getLookAndFeelDefaults().put("Panel.background", Color.white);
                    UIManager.getLookAndFeelDefaults().put("nimbusFocus", Color.blue);
                    UIManager.getLookAndFeelDefaults().put("Button[Focused+MouseOver].backgroundPainter",
                            new FillPainter(new Color(127, 255, 191)));
                    UIManager.getLookAndFeelDefaults().put("Button[MouseOver].backgroundPainter",
                            new FillPainter(new Color(127, 255, 191)));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                NimbusJPanelBackGround nimbusJPanelBackGround = new NimbusJPanelBackGround();
            }
        });
    }
}

class FillPainter implements Painter<JComponent> {

    private final Color color;

    public FillPainter1(Color c) {
        color = c;
    }

    @Override
    public void paint(Graphics2D g, JComponent object, int width, int height) {
        g.setColor(color);
        g.fillRect(0, 0, width - 1, height - 1);
    }
}


来源:https://stackoverflow.com/questions/10787152/with-nimbus-make-control-background-color-yellow-only-when-control-has-focus

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!