Java:外观和感觉

时间:2014-03-31 09:47:53

标签: java swing netbeans look-and-feel

我在Windows机器上使用Netbeans,会发生的情况是,如果我运行主java文件,我获得的外观与我运行整个程序的情况不同。 这意味着如果我这样做: enter image description here

我得到了

enter image description here

但如果我这样做

enter image description here

我得到enter image description here

您是否看到了两个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:我的导航器

的外观

enter image description here

更新3:文件结构

enter image description here

6 个答案:

答案 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应该在启动时只建立一次,而不是每次都建立   顶级容器(JFrameJDialog ...)。

您还可以查看Programatically Setting the Look and Feel文章的How to Set the Look and Feel

修改

  

我只是不明白一件只测试主要方法的事情   需要删除,如果我删除它们,我的prg将如何正常运行?

Java应用程序必须只有一个main方法才能执行。在部署JAR时,具有此main方法的类在MANIFEST.MF文件中定义。因此,不需要在每个顶级容器(mainJFrame)中使用JDialog方法,这不是一个好习惯。

但是,有时您不希望运行整个应用程序来测试特定帧/对话框的工作方式。这就是NetBeans在mainJFrame创建时包含此JDialog方法的原因。但如上所述,当您部署JAR时,您应该删除那些“额外”main方法。

  

,是的,因为你在我创造新的时候已经给出了如何做到这一点   jframes,但我已经有20多个了

Swing应用程序通常只有一个JFrame和多个JDialog。请查看此主题以获取更多详细信息:The Use of Multiple JFrames, Good/Bad Practice?

  

无论如何它是那里的灵气,这是我想要的,但那就是   不是什么开放

您只需要在main类(运行整个应用程序时执行的类)中以编程方式将L& F设置为Nimbus。您可以复制粘贴 Update 1 中包含的代码。

编辑2

在NetBeans中创建新项目时,它会要求您创建一个主类。假设我创建了一个名为Test的新项目,它会要求我创建一个这样的主类:

enter image description here

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

enter image description here

在这个主要方法中,您必须将您包含的代码放在 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

enter image description here


如果我只是运行MyFrame,我会:

enter image description here


因此,如果您为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);
            }
        });
    }
}

enter image description here

答案 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();