【问题标题】:Java: Look and FeelJava:外观和感觉
【发布时间】:2014-03-31 09:47:52
【问题描述】:

我在 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 的外观和感觉,但问题是当我打开罐子时,Nimbus 的外观和感觉不存在

更新 2:我的 Navigator

外观

更新 3:文件结构

【问题讨论】:

  • 您是否更改了代码中的 LAF?如果可以,请给我们看看。
  • 注意:主要功能在 JAR 中不起作用!?
  • 我注意到 Java 应用程序 (UI) 以某种方式继承了您的操作系统的外观和感觉(如果这里用的正确的话?)
  • @ThorstenDittmar 那只是我正在做的一个 printf,它不相关
  • @MaciejCygan 那么如何让它使用我想要的那个

标签: java swing netbeans look-and-feel


【解决方案1】:

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

当您运行 Swing 应用程序时,默认外观设置为跨平台 L&F,也称为 Metal。另一方面,当您从 NetBeans 新建文件 向导创建新的 JFrame 时,它还包含一个仅用于测试目的的 main 方法,使开发人员能够“运行”顶级容器。在这个main 方法中,外观设置为Nimbus,正如您在更新1中所包含的那样。

这在本问答中得到了很好的解释: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 时,在 MANIFEST.MF 文件中定义了具有此 main 方法的类。因此,不需要在每个顶级容器(JFrame 或 JDialog)中使用 main 方法,这不是一个好习惯。

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

是的,当我创建新的时,你已经给出了如何做 jframes,但我已经有 20 个了

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

不管怎样,那里是灵气,这是我想要的,但那是 不是打开的内容

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

编辑 2

当您在 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文章中解释。

【讨论】:

  • 我只是不明白我需要删除哪些仅用于测试的主要方法,如果我删除它们,我的 prg 将如何正常运行?
  • 是的,当我创建新的 jframe 时,你已经给出了如何做到这一点,但我已经有 20 个了
  • 无论如何它是灵气在那里,这是我想要的,但这不是开放的:(
  • 请查看我的编辑 :) 如果您仍有疑问,请告诉我。 @DakshShah
  • 我发现它必须进入 freetts 而不是另一个 :P :D
【解决方案2】:

可能的问题。

如果您有一个启动应用程序的主类,请说一个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);
            }
        });
    }
}

【讨论】:

【解决方案3】:

我建议尝试在您的主要方法中更改您的 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 更改之后。

【讨论】:

  • @DakshShah 您的 Frame 设置为在更改 LAF 之前还是之后可见?
  • 我建议尝试在主文件末尾添加以下内容:try{ SwingUtilities.updateComponentTreeUI(f); }catch(Exception e){/*Do what you want*/}
  • 正是这段代码在 main 的末尾?我应该在开始时保持原样吗?
  • 只需从评论中获取 try-catch 并将其粘贴到您的主要内容的末尾,所以是的。但是将 f 更改为包含 Frame 的变量。
  • 我不知道名字,你能从我给出的代码中弄清楚吗?
【解决方案4】:

也许你可以试试这些?

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");

【讨论】:

  • 我应该在哪里添加这些?
  • 在您的主要课程中,尝试这两种方法之一。删除 try-catch 中的 for 循环,然后添加上面的行之一。看看输出是什么。 Ps 确保在任何更改后编译新 jar
  • 所以我得一一尝试这些?在 try 块中对吗?我必须保留 ctach 块吗?
  • 这两行都给了我同样糟糕的用户界面
  • 感谢您的帮助(我赞成您的回答,因为您试图帮助我很多;))
【解决方案5】:

如果应用程序。在系统上(在 IDE 之外)在 Java 1.6 中运行,它不有权访问Nimbus(滚动到底部以查看@since 元素)。 Nimbus 仅在 1.7 中可用。

【讨论】:

  • 我检查了 cmd java -version 它告诉我运行的 java 版本是 1.7.0_51-b13
  • 再次这是不可能的,再次 1) 保存时编译的设置是什么(运行项目来自已编译的 Jar,不包含任何更改),2) eeeeeerhgt 有源/二进制格式,whats JDK 在那里,但默认运行项目和运行文件使用相同的设置,一切都来自项目属性
  • 实际上@Andrew,根据 Oracle 文档,Nimbus 在 1.6 中可用?
【解决方案6】:

要确定外观,您可以使用UIManager.getSystemLookAndFeelClassName()阅读当前使用的外观和感觉

如果您知道自己喜欢的外观和感觉,可以使用UIManager.setLookAndFeel(look) 进行设置(在创建您的 GUI 元素之前!)

但请记住:您应该检查此外观是否可用(在安装了其他外观的另一个操作系统上之前将其设置)

更多信息:

编辑: 要确定安装的外观和感觉:

UIManager.LookAndFeelInfo plaf[] = UIManager.getInstalledLookAndFeels();

【讨论】:

  • 你能告诉我第一个是哪个外观吗?以及如何设置它现在不是之前而是在创建 evrything 之后
  • 只需添加代码 System.out.println(UIManager.getSystemLookAndFeelClassName());到您的代码并执行它 - 它将显示在控制台上,您可以继续使用。 UIManager.setLookAndFeel(..) 可以在创建窗口之前在 main 方法中调用 - 然后为整个运行时设置此设置
  • @AndrewThompson Y 我需要检查已安装的吗?因为在某些情况下 nimbus 正在我的机器上运行,所以必须安装它:P
猜你喜欢
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多