2

Java で Nimbus L&F フィールを使用しているときに、JButton の背景色を複数回変更すると問題が発生します。以下のコードには、JButton を表示し、1 秒に 1 回色を変更しようとする単純な Swing アプリケーションがあります。ただし、適用されるのは最初の色のみです。この変更を複数回行う方法について、誰か提案を提供できますか? 私は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);
            }
        });
    }
}
4

2 に答える 2

4

編集 :

その直接的な方法を変更することはできないことに同意しました (おそらく別の汚いハックがあるかもしれません) 非常に複雑な方法 (Nimbus L&F の開発は前半のどこかで終了しました) では、別の (同様の) 問題がフォントに関する私の質問にあります

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);
            }
        });
    }
}
于 2012-05-21T14:11:50.720 に答える
1

次の行を追加する必要があります。

button.setBackground(c);

あなたのコードに。他のコード - buttonDefaultsputClientProperty、は必要ありupdateComponentTreeUIません。repaint

于 2012-05-21T14:11:53.557 に答える