Java 在Ubuntu中,外观和感觉没有改变

Java 在Ubuntu中,外观和感觉没有改变,java,swing,ubuntu,look-and-feel,Java,Swing,Ubuntu,Look And Feel,有人知道为什么laf在下面的代码中没有改变吗?(在Ubuntu中运行) 导入java.awt.Dialog; 导入java.awt.event.ActionEvent; 导入java.awt.event.ActionListener; 导入javax.swing.JComboBox; 导入javax.swing.JDialog; 导入javax.swing.JPanel; 导入javax.swing.UIManager; 导入javax.swing.UIManager.LookAndFeelIn

有人知道为什么laf在下面的代码中没有改变吗?(在Ubuntu中运行)

导入java.awt.Dialog;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.JComboBox;
导入javax.swing.JDialog;
导入javax.swing.JPanel;
导入javax.swing.UIManager;
导入javax.swing.UIManager.LookAndFeelInfo;
公共类测试扩展了JPanel{
公开考试(){
final LookAndFeelInfo[]lafArray=UIManager.getInstalledLookAndFeels();
字符串[]名称=新字符串[lafArray.length];
for(int i=0;i
调用
UIManager.setLookAndFeel(lafClassName)
后,调用
SwingUtilities.updateComponentTreeUI(cb.getParent)
。在更完整的应用程序中,必须在每个顶级容器上调用它。由于LAF之间的组件大小不同,您还应该在容器上调用
pack()

在调用
UIManager.setLookAndFeel(lafClassName)
后,调用
SwingUtilities.updateComponentTreeUI(cb.getParent)
。在更完整的应用程序中,必须在每个顶级容器上调用它。由于LAF之间的组件大小不同,还应在容器上调用
pack()

渲染组件后,不应更改外观。必须在初始化组件之前完成此操作。发件人:

注意:如果要设置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,以此类推


渲染组件后,不应更改外观。必须在初始化组件之前完成此操作。发件人:

注意:如果要设置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,以此类推


我想在运行时进行更改,就像SwingSet3对应用程序进行挂起一样,看起来除了要求用户重新启动应用程序之外别无选择。悲哀。@Tom:实际上Java教程中的注释是指,如果不将L&F设置为应用程序的第一步,Java L&F可能会被初始化,即使这不是所需的。这并不意味着您以后不能更改L&F。请参阅您链接到的同一页面中的“启动后更改外观”部分。我想在运行时进行更改,就像SwingSet3 doesDepending应用程序一样,看起来除了要求用户重新启动应用程序之外别无选择。悲哀。@Tom:实际上Java教程中的注释是指,如果不将L&F设置为应用程序的第一步,Java L&F可能会被初始化,即使这不是所需的。这并不意味着您以后不能更改L&F。请参阅您链接到的同一页面中的“启动后更改外观”部分。我将尝试。奇怪的是,在我的房子里,我不需要在Windows中运行它。@Tom Brito:尽管如此,Sun的教程告诉你要做的就是:在这个例子中效果很好。但是有没有一种方法可以更新所有swing组件,即使它们不在树中?@Tom:它们应该总是在某个树中,在当前可见的顶级容器中。如果没有,则不会显示它们。我将尝试。奇怪的是,在我的房子里,我不需要在Windows中运行它。@Tom Brito:尽管如此,Sun的教程告诉你要做的就是:在这个例子中效果很好。但是有没有一种方法可以更新所有swing组件,即使它们不在树中?@Tom:它们应该总是在某个树中,在当前可见的顶级容器中。如果不是,则不显示它们。
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");
    }

}