【问题标题】:Problems changing JButton background colors multiple times in Nimbus L&F在 Nimbus L&F 中多次更改 JButton 背景颜色的问题
【发布时间】:2012-05-28 01:02:45
【问题描述】:

在 Java 中使用 Nimbus L&F 感觉时,我在多次更改 JButton 的背景颜色时遇到了问题。在下面的代码中,我有一个简单的 Swing 应用程序,它显示一个 JButton 并尝试每秒更改一次颜色。但是,仅应用了第一种颜色。任何人都可以就如何多次进行此更改提供任何建议吗?我正在运行 java 6.29。

public class NimbusTest3 extends JFrame {
    private javax.swing.JButton button;

    public NimbusTest3(){
        button = new javax.swing.JButton();
        button.setText("Text");
        this.add(button, BorderLayout.CENTER);
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        this.pack();

        Timer t = new Timer(1000, new ActionListener() {
            Random r = new Random();
            @Override
            public void actionPerformed(ActionEvent e) {
                UIDefaults buttonDefaults = UIManager.getLookAndFeelDefaults();
                Color c = new Color(r.nextInt(
                        256), r.nextInt(256), r.nextInt(256));
                System.out.println(c);
                buttonDefaults.put("Button.background", c);
                button.putClientProperty("Nimbus.Overrides", buttonDefaults);
                button.putClientProperty("Nimbus.Overrides.InheritDefaults", false);
                SwingUtilities.updateComponentTreeUI(button);
                button.repaint();
            }
        });
        t.start();
    }

    public static void main(String args[]) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (Exception e) {
            return;
        } 

        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new NimbusTest3().setVisible(true);
            }
        });
    }
}

【问题讨论】:

    标签: java swing jbutton look-and-feel nimbus


    【解决方案1】:

    编辑:

    我同意不可能以非常复杂的方式(Nimbus L&F 的开发在上半年结束),another (similair) issue is in my question about Font

    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    import javax.swing.JFrame;
    import javax.swing.LookAndFeel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    import javax.swing.UIDefaults;
    import javax.swing.UIManager;
    import javax.swing.UIManager.LookAndFeelInfo;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class NimbusTest3 extends JFrame {
    
        private static final long serialVersionUID = 1L;
        private javax.swing.JButton button;
    
        public NimbusTest3() {
            button = new javax.swing.JButton();
            button.setText("Text");
            add(button);
            setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
            this.pack();
            Timer t = new Timer(1000, new ActionListener() {
    
                private Random r = new Random();
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    Color c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
                    try {
                        LookAndFeel lnf = UIManager.getLookAndFeel().getClass().newInstance();
                        UIDefaults uiDefaults = lnf.getDefaults();
                        uiDefaults.put("nimbusBase", c);
                        UIManager.getLookAndFeel().uninitialize();
                        UIManager.setLookAndFeel(lnf);
                    } catch (InstantiationException ex) {
                    } catch (IllegalAccessException ex) {
                    } catch (UnsupportedLookAndFeelException ex) {
                    }
                    UIDefaults defaults = UIManager.getDefaults();
                    defaults.put("Button.background", c);
                    SwingUtilities.updateComponentTreeUI(button);
                }
            });
            t.start();
        }
    
        public static void main(String args[]) {
            try {
                for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (Exception e) {
                return;
            }
    
            java.awt.EventQueue.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    new NimbusTest3().setVisible(true);
                }
            });
        }
    }
    

    【讨论】:

    • @mKorbel updateComponentTreeUI 已经被调用,所以它不能解决他的问题。但是,如果 OP 必须在其所有组件上使用专用客户端属性,则使用 L&F 没有多大意义。那么“Rob I”解决方案实际上要简单得多,效率更高。
    • 您是否检查过 Nimbus Default for JButton
    • @mKorbel 感谢您提供的链接,但它们似乎无法解决多次设置值的问题。
    • @Gregory Peck 在那里看到我的编辑,我在肮脏的 Tunels 中寻找替代方案,???也许存在????但对于第一个版本,用于非官方 Nimbus L&F
    • @mKorbel 谢谢,这行得通!它只改变它所应用的 JButton 的颜色,而其余的 UI 保持不变。另外,您所说的“非官方 Nimbus L&F”是什么意思?
    【解决方案2】:

    你需要添加这一行:

    button.setBackground(c);
    

    到您的代码。其他代码都不需要 - buttonDefaultsputClientPropertyupdateComponentTreeUIrepaint

    【讨论】:

    • 感谢 Rob,因为它确实设置了颜色。以这种方式设置时,Nimbus 甚至会为按钮添加适当的高光/阴影。虽然这是我将在我的应用程序中使用的解决方案,但我会暂时搁置这个问题,看看是否有人可以使用 Nimbus 属性回答它。
    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2011-01-28
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多