我在Windows机器上使用Netbeans,会发生的情况是,如果我运行主java文件,我获得的外观与我运行整个程序的情况不同。 这意味着如果我这样做:
我得到了
但如果我这样做
我得到
您是否看到了两个java输出的外观和感觉上的差异?为什么会这样?我希望当我将它导出到Jar时它应该像第一种情况一样打开,看起来很漂亮的按钮。怎么样?
更新1: 我在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());
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的外观和感觉不存在
更新2:我的导航器
的外观
更新3:文件结构
答案 0 :(得分:4)
我在Windows机器上使用Netbeans,如果我,会发生什么 运行主java文件我得到的外观和感觉是不同的 我运行整个程序的情况。
当您运行Swing应用程序时,默认外观设置为跨平台L& F,也称为Metal。另一方面,当您从NetBeans 新文件向导创建新的JFrame时,它还包含一个main
方法,仅用于测试目的,使开发人员能够“运行”顶部级容器。在此main
方法中,外观设置为Nimbus,因为您已包含在 Update 1 中。
本Q& A:How can I change the default look and feel of Jframe? (Not theme of Netbeans)对此进行了详细解释。如上所述,您可以修改与JFrame
表格相关联的模板,以设置您希望的L& F.但请注意这一行:
Java应用程序只需要一个
main
类,因此这个仅测试main
部署应用程序时应删除方法。 [...] L& F应该在启动时只建立一次,而不是每次都建立 顶级容器(JFrame
,JDialog
...)。
您还可以查看Programatically Setting the Look and Feel文章的How to Set the Look and Feel。
我只是不明白一件只测试主要方法的事情 需要删除,如果我删除它们,我的prg将如何正常运行?
Java应用程序必须只有一个main
方法才能执行。在部署JAR时,具有此main
方法的类在MANIFEST.MF
文件中定义。因此,不需要在每个顶级容器(main
或JFrame
)中使用JDialog
方法,这不是一个好习惯。
但是,有时您不希望运行整个应用程序来测试特定帧/对话框的工作方式。这就是NetBeans在main
或JFrame
创建时包含此JDialog
方法的原因。但如上所述,当您部署JAR时,您应该删除那些“额外”main
方法。
,是的,因为你在我创造新的时候已经给出了如何做到这一点 jframes,但我已经有20多个了
Swing应用程序通常只有一个JFrame
和多个JDialog
。请查看此主题以获取更多详细信息:The Use of Multiple JFrames, Good/Bad Practice?
无论如何它是那里的灵气,这是我想要的,但那就是 不是什么开放
您只需要在main
类(运行整个应用程序时执行的类)中以编程方式将L& F设置为Nimbus。您可以复制粘贴 Update 1 中包含的代码。
在NetBeans中创建新项目时,它会要求您创建一个主类。假设我创建了一个名为Test
的新项目,它会要求我创建一个这样的主类:
这个生成的Test
类将具有触发应用程序执行的main
方法:
在这个主要方法中,您必须将您包含的代码放在 Update 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()文章中解释了Initial Threads来电的原因。
答案 1 :(得分:3)
可能的问题。
如果您有一个主要类,您可以从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);
}
});
}
}
答案 2 :(得分:2)
我建议您尝试在主要方法中更改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);
改变你的LAF后。
答案 3 :(得分:2)
也许你可以试试这些?
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
编辑:
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
答案 4 :(得分:2)
如果应用程序。在系统上(IDE外部)运行Java 1.6,它 无法访问Nimbus(滚动到@since
元素的底部)。 Nimbus仅在1.7版本上可用。
答案 5 :(得分:1)
确定您可以使用UIManager.getSystemLookAndFeelClassName()
如果您知道自己喜欢的外观,可以使用UIManager.setLookAndFeel(look)
进行设置(在创建GUI元素之前!)
但请记住:你应该检查一下这个外观是否可用(之前在另一个安装了其他外观的操作系统上进行设置)
更多信息:
编辑: 确定已安装的外观:
UIManager.LookAndFeelInfo plaf[] = UIManager.getInstalledLookAndFeels();