Java:外观和感觉

Dak*_*hah 9 java swing netbeans look-and-feel

我在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...
}
Run Code Online (Sandbox Code Playgroud)

所以它应该设置灵气的外观和感觉,但问题是当我打开罐子时,Nimbus的外观和感觉不存在

更新2:我的导航器外观

在此输入图像描述

更新3:文件结构

在此输入图像描述

dic*_*c19 5

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

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

这在此问答中得到了很好的解释:如何更改 Jframe 的默认外观?(不是 Netbeans 的主题)。如上所述,您可以修改与JFrame表单关联的模板以设置您想要的 L&F。但是请注意这一行:

Java 应用程序只需要一个main类,因此main 在部署应用程序时应删除此仅测试方法。[...] L&F 应该只在启动时建立一次,而不是在每个顶级容器中(JFrame, JDialog...)。

您还可能看看到编程方式设置外观和感觉如何设置的外观和感觉的文章。

编辑

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

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

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

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

Swing 应用程序通常有一个JFrame和多个JDialog。有关更多详细信息,请查看此主题:多个 JFrame 的使用,好/坏做法?

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

您只需要在您的main类中以编程方式将 L&F 设置为 Nimbus (在您运行整个应用程序时执行的那个)。您可以将包含在更新 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);
                        }
                    }
                }                                       
            }
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,当您运行应用程序时,L&F 将设置为 Nimbus,覆盖默认的跨平台 L&F。从今以后,所有创建的 Swing 组件都将 Nimbus 作为 L&F。

注意:SwingUtilities.invokeLater()调用的原因在Initial Threads 一文中有解释。


归档时间:

查看次数:

4269 次

最近记录:

11 年,8 月 前