2

JApplet を作成し、初期化時に Nimbus L&F の色を設定しました。

Netbeans または Google Chrome の両方を介してアプレットを実行すると、ボタンの背景が暗く設定されることが 9/10 回発生しますが、Nimbus が色を設定できない場合があります。

SSCCE は次のとおりです。

import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
import javax.swing.UIManager;

public class NimbusColors extends javax.swing.JApplet {

    // colors and look and feel
    Color buttonBackgroundColor;
    Color buttonTextColor;
    Color textAreaBackgroundColor;
    Color textAreaTextColor;
    Color skinColor;
    Color defaultButtonBackgroundColor = Color.decode("#4a4a4a");
    Color defaultButtonTextColor = Color.decode("#cecece");
    Color defaultTextAreaBackgroundColor = Color.decode("#414141");
    Color defaultTextAreaTextColor = Color.decode("#cecece");
    Color defaultSkinColor = Color.decode("#353535");
    Color progressColor = Color.decode("#00FFFF");

    @Override
    public void init() {

        getContentPane().setBackground(defaultSkinColor);
        UIManager.put("TextArea.background", defaultTextAreaBackgroundColor);
        UIManager.put("TextArea.foreground", defaultTextAreaTextColor);
        UIManager.put("control", defaultTextAreaBackgroundColor);
        UIManager.put("nimbusLightBackground", defaultSkinColor);
        UIManager.put("background", defaultSkinColor);
        UIManager.put("text", defaultButtonTextColor);
        UIManager.put("ComboBox.background", defaultSkinColor.darker().darker());
        UIManager.put("Button.background", defaultSkinColor);
        UIManager.put("info", defaultSkinColor.brighter().brighter());

        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NimbusColors.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        /* Create and display the applet */
        try {
            java.awt.EventQueue.invokeAndWait(new Runnable() {
                @Override
                public void run() {
                    initComponents();
                }
            });
        } catch (InterruptedException | InvocationTargetException ex) {
            System.exit(11);
        }
    }

    private void initComponents() {

        jButtonBrowseFS = new javax.swing.JButton();

        jButtonBrowseFS.setText("Browse");
        jButtonBrowseFS.setToolTipText("Browse your filesystem to select files to upload");
        jButtonBrowseFS.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
        jButtonBrowseFS.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonBrowseFS)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButtonBrowseFS)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    }              
    private javax.swing.JButton jButtonBrowseFS;
}

このコードを Netbeans 7.3.1 で試し、新しい Java プロジェクトを作成し、新しい JApplet ファイルを追加しました。Netbeans からファイルを何十回も実行すると、ボタンの背景が暗い場合とそうでない場合があります。

誰でもこの奇妙な動作を再現できますか? 何が起こっている?

更新 1 : Windows 8 Pro を実行しています

4

3 に答える 3

2

コードを試しましたが、常に同じ色が表示されます。Netbeans または jdk のバージョンに問題があると思います。Netbeans 7.3 と jdk 1.6 を使用しています。 ここに画像の説明を入力

于 2013-07-10T10:06:15.350 に答える
2
  • JButton にはPainter が使用されているため、デフォルトでは Background は無視されます

  • Java6/7の間で変更はありません

  • すべてのキーが期待どおりに機能するわけではありません。Nimbus には多くの suprice があります (Nimbus に基づいて 2 ~ 3 のカスタム L&F で解決されます)。

  • たとえば、スイングタイマーを使用して意図的に遅延させる方法の1つは、すべての場合に機能します

ここに画像の説明を入力

Color.decode("#353535");戻り値

ここに画像の説明を入力

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 {

    private static final long serialVersionUID = 1L;
    private javax.swing.JButton button;
    private JFrame frame = new JFrame();
    private Timer t;

    public NimbusTest3() {
        button = new javax.swing.JButton();
        button.setText("Text");
        frame.add(button);
        frame.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        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.stop();
            }
        });
        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() {
                NimbusTest3 nimbusTest3 = new NimbusTest3();
            }
        });
    }
}
于 2013-07-10T10:14:09.443 に答える
0

私は最終的に回避策を見つけました。

netbeans では、ボタンの background プロパティを何らかの値に設定しました (必要な値とは異なりますが、デフォルトの 240,240,240 とも異なります)。

アプレットを実行すると、常に期待どおりの結果が得られます。これは、Nimbus のコードで設定された色です。

于 2014-01-08T12:01:38.473 に答える