Java 在Ubuntu中,外观和感觉没有改变
有人知道为什么laf在下面的代码中没有改变吗?(在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
导入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");
}
}