0

次のコードでlafが変更されない理由を誰もが知っていますか?(Ubuntuで実行)

import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class TEST extends JPanel {

    public TEST() {
    final LookAndFeelInfo[] lafArray = UIManager.getInstalledLookAndFeels();
    String[] names = new String[lafArray.length];
    for (int i = 0; i < names.length; i++) {
        names[i] = lafArray[i].getName();
    }

    final JComboBox cb = new JComboBox(names);
    cb.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ev) {
        try {
            int index = cb.getSelectedIndex();
            LookAndFeelInfo lafInfo = lafArray[index];
            String lafClassName = lafInfo.getClassName();
            System.out.println(lafClassName);
            UIManager.setLookAndFeel(lafClassName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    });

    add(cb);
    }

    public static void main(String[] args) throws Exception {
    System.out.println("start");

    JDialog dialog = new JDialog(null, Dialog.ModalityType.APPLICATION_MODAL);
    dialog.setContentPane(new TEST());
    dialog.pack();
    dialog.setLocationRelativeTo(null);
    dialog.setVisible(true);
    dialog.dispose();

    System.out.println("end");
    }

}
4

2 に答える 2

4

を呼び出した後UIManager.setLookAndFeel(lafClassName)、を呼び出しますSwingUtilities.updateComponentTreeUI(cb.getParent)。より完全なアプリケーションでは、各トップレベルコンテナで呼び出す必要があります。pack()また、lafs間でコンポーネントのサイズが異なるため、コンテナを呼び出す必要があります。

于 2010-04-16T21:00:21.517 に答える
2

コンポーネントがレンダリングされたら、ルックアンドフィールを変更しないでください。コンポーネントを初期化する前に実行する必要があります。ここから:

注:L&Fを設定する場合は、アプリケーションの最初のステップとして設定する必要があります。そうしないと、要求したL&Fに関係なく、Java L&Fを初期化するリスクがあります。これは、静的フィールドがSwingクラスを参照している場合に誤って発生する可能性があり、これによりL&Fがロードされます。L&Fがまだ指定されていない場合は、JREのデフォルトのL&Fがロードされます。SunのJREの場合、デフォルトはJava L&F、AppleのJREの場合はApple L&Fなどです。

于 2010-04-16T21:01:27.867 に答える