【问题标题】: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 应该只在启动时建立一次,而不是在每个 顶级容器(JFrameJDialog...)。

您也可以看看Programatically Setting the Look and FeelHow to Set the Look and Feel 文章。

编辑

我只是不明白只有测试的主要方法可以做什么 需要删除,如果我删除它们,我的 prg 将如何正常运行?

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

但是,有时您不想运行整个应用程序来测试特定框架/对话框的工作方式。这就是 NetBeans 在创建 JFrameJDialog 时包含此 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
相关资源
最近更新 更多