首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:看和感觉

Java:看和感觉
EN

Stack Overflow用户
提问于 2014-03-31 09:47:52
回答 6查看 5.8K关注 0票数 10

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

我得到了

但如果我这么做

我得到了

您看到了这两个java输出在外观和感觉上的差异吗?它为什么在那里?我想,当我把它出口到Jar时,它应该像第一箱那样打开,漂亮的按钮。多么?

更新1:我在主程序的开头找到了以下代码:

代码语言:javascript
复制
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外观和感觉,但问题是,当我打开jar时,Nimbus的外观和感觉并不存在。

更新2: --看我的导航器

更新3:文件结构

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-03-31 11:25:14

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

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

这一点在Q&A:如何更改Jframe的默认外观和感觉?(不是Netbeans的主题)中得到了很好的解释。如前所述,您可以修改与JFrame表单关联的模板,以设置您希望的L&F。然而,请注意这一行:

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

您还可以看看通过编程设置外观和感觉 of 如何设置外观和感觉的文章。

编辑

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

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

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

是的,当我创建新的jframes时,您已经给出了如何实现它,但是我已经有了20多个了。

一个Swing应用程序有一个JFrame和多个JDialog

不管怎样,它是尼布斯在那里,这是我想要的,但这不是开放的东西。

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

编辑2

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

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

在这个主要方法中,您必须将包含在更新1中的代码

代码语言:javascript
复制
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()调用的原因在初始线程文章中解释。

票数 5
EN

Stack Overflow用户

发布于 2014-03-31 12:37:20

可能有问题。

如果您有一个启动应用程序的主类,比如一个Main类。如果这个类中没有设置外观和感觉,那么结果将是您正在经历的。

假设您有Main,您可以在其中启动MyFrame。(请原谅第二种主要方法,例如,就像OP的情况一样)

代码语言:javascript
复制
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中,它将得到以下结果

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-03-31 10:08:51

我建议在您的主要方法中尝试更改LAF,例如:

代码语言:javascript
复制
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);就能做这件事。

代码语言:javascript
复制
f.setVisible(true);

在你的黎巴嫩武装部队改变之后。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22758459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档