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)。在更完整的应用程序中,您必须在每个顶级 Container 上调用它。pack()由于 laf 之间的组件大小不同,您还应该调用Container。

于 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 回答