我在Windows机器上使用Netbeans,如果我运行主java文件,我得到的外观和感觉与运行整个程序的情况不同。意思是如果我这么做:

我得到了

但如果我这么做

我得到了

您看到了这两个java输出在外观和感觉上的差异吗?它为什么在那里?我想,当我把它出口到Jar时,它应该像第一箱那样打开,漂亮的按钮。多么?
更新1:我在主程序的开头找到了以下代码:
public static void main(String args[]) {
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 ex) {
java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
} catch (javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(FormTTS.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//Some code here...
}因此,它应该设置nimbus外观和感觉,但问题是,当我打开jar时,Nimbus的外观和感觉并不存在。
更新2: --看我的导航器

更新3:文件结构

发布于 2014-03-31 11:25:14
我在Windows机器上使用Netbeans,如果我运行主java文件,我得到的外观和感觉与运行整个程序的情况不同。
运行Swing应用程序时,默认的外观和感觉被设置为跨平台的L&F,也称为金属。另一方面,当您从JFrame新建文件向导创建一个新的NetBeans时,它还包含一个仅用于测试目的的main方法,使开发人员能够“运行”顶级容器。在此main方法中,外观和感觉被设置为尼姆布斯,正如您在更新1中所包含的那样。
这一点在Q&A:如何更改Jframe的默认外观和感觉?(不是Netbeans的主题)中得到了很好的解释。如前所述,您可以修改与JFrame表单关联的模板,以设置您希望的L&F。然而,请注意这一行:
Java应用程序只需要一个
main类,因此在部署应用程序时,应该删除这个只测试的main方法。..。L&F应在启动时只建立一次,而不是在每个顶级容器(JFrame、JDialog.)中建立。
您还可以看看通过编程设置外观和感觉 of 如何设置外观和感觉的文章。
编辑
我只是不明白什么是测试的主要方法,我需要删除,如果我删除它们,我的prg将如何正常运行?
Java应用程序必须只有一个在执行过程中使用的main方法。部署JAR时,具有此main方法的类是在MANIFEST.MF文件中定义的。因此,在每个顶级容器(JFrame或JDialog)中都不需要有一个JDialog方法,这也不是一个好的实践。
但是,有时您不希望运行整个应用程序来测试特定的框架/对话框是如何工作的。这就是为什么NetBeans在创建JFrame或JDialog时包含了这个main方法。但是如上所述,当您部署JAR时,您应该删除那些“额外”的main方法。
是的,当我创建新的jframes时,您已经给出了如何实现它,但是我已经有了20多个了。
一个Swing应用程序有一个JFrame和多个JDialog。
不管怎样,它是尼布斯在那里,这是我想要的,但这不是开放的东西。
您只需要在main类中以编程方式将L&F设置为Nimbus (在运行整个应用程序时执行的)。您可以复制粘贴您在更新1中包含的代码。
编辑2
当您在NetBeans中创建一个新项目时,它也要求您创建一个主类。假设我创建了一个名为Test的新项目,它将要求我创建这样一个主类:

这个生成的Test类将具有触发应用程序执行的main方法:

在这个主要方法中,您必须将包含在更新1中的代码
public class Test {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
try {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
} catch (ClassNotFoundException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (InstantiationException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedLookAndFeelException ex) {
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
});
}
}然后,当您运行应用程序时,L&F将被设置为Nimbus,覆盖默认的跨平台L&F。从今以后,所有创建的Swing组件都将使用Nimbus作为L&F。
注: SwingUtilities.invokeLater()调用的原因在初始线程文章中解释。
发布于 2014-03-31 12:37:20
可能有问题。
如果您有一个启动应用程序的主类,比如一个Main类。如果这个类中没有设置外观和感觉,那么结果将是您正在经历的。
假设您有Main,您可以在其中启动MyFrame。(请原谅第二种主要方法,例如,就像OP的情况一样)
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new MyFrame().setVisible(true);
}
});
}
}
public class MyFrame extends JFrame {
public static void main(String[] args) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
...
}您将得到结果(即使将外观和感觉设置为MyFrame):

如果我只运行MyFrame,就会得到:

因此,如果将外观和感觉添加到您的Main中,它将得到以下结果
public class Main {
public static void main(String[] args) {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
...
SwingUtilities.invokeLater(new Runnable(){
public void run() {
new MyFrame().setVisible(true);
}
});
}
}

发布于 2014-03-31 10:08:51
我建议在您的主要方法中尝试更改LAF,例如:
public static void main(String[] args){
Frame f; // Your (J)Frame or GUI-Class.
// some code here...
try{
UIManager.setLookAndFeel(new NimbusLookAndFeel()) // Because it seems to be Nimbus what you want.
SwingUtilities.updateComponentTreeUI(f); // To refresh your GUI
}catch(Exception e){
// Do whatever you want if a problem occurs like LAF not supported.
}
}如果你打电话给我,你也可以不用SwingUtilities.updateComponentTreeUI(f);就能做这件事。
f.setVisible(true);在你的黎巴嫩武装部队改变之后。
https://stackoverflow.com/questions/22758459
复制相似问题