Java没有';当从另一个类调用时,不会更改外观

Java没有';当从另一个类调用时,不会更改外观,java,swing,look-and-feel,nimbus,Java,Swing,Look And Feel,Nimbus,我是java新手,在尝试更改从另一个类调用的java文件的外观时遇到了一个问题。我有两个类,main.java和auth.java。我在auth.java文件中将外观设置为nimbus。当我尝试从main.java调用auth类时(我已经附上了下面的代码片段),UI没有改变。但是当我使用 auth.java中的publicstaticvoidmain(String[]args)并尝试单独运行该文件jFrame的UI会发生更改。当从另一个类调用jFrame时,请告诉我是否有方法更改其UI。从另一个

我是java新手,在尝试更改从另一个类调用的java文件的外观时遇到了一个问题。我有两个类,
main.java
auth.java
。我在
auth.java
文件中将外观设置为nimbus。当我尝试从main.java调用auth类时(我已经附上了下面的代码片段),UI没有改变。但是当我使用
auth.java中的publicstaticvoidmain(String[]args)并尝试单独运行该文件
jFrame
的UI会发生更改。当从另一个类调用
jFrame
时,请告诉我是否有方法更改其UI。从另一个类调用
jFrame
是否有问题,这是一个好的做法吗?因为我们正在做一个大项目,需要偶尔调用一次身份验证框架,所以有什么建议吗? 提前谢谢大家!:)

main.java:

package com.package.name;
public class main {
    public static void main(String[] args) {
        new auth();
    }
}
这是我的auth.java代码的一部分:

package com.package.name;
import javax.swing.*; 
import java.awt.*;

public class auth extends JFrame {
    public auth() {
        initComponents();
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel ( "javax.swing.plaf.nimbus.NimbusLookAndFeel" );
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (UnsupportedLookAndFeelException e) {
                    e.printStackTrace();
                }
                setVisible(true);
                setDefaultCloseOperation(EXIT_ON_CLOSE);
                pack();
            }
        });
    }

在更改外观之前,您已经调用了
initComponents
。这将在这些组件中安装当前安装的外观

无需指导每个组件更新其UI,您只需使用
initComponents
方法交换外观的安装,例如

try {
    UIManager.setLookAndFeel ( "javax.swing.plaf.nimbus.NimbusLookAndFeel" );
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
}
initComponents();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
话虽如此,现在。在调用
auth
构造函数之前,您确实应该在EDT的上下文中,而
auth
不应该真正决定外观。如果您想以不同的外观再次使用此框架,会发生什么情况

相反,我们可以做一些更像

public class main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel ( "javax.swing.plaf.nimbus.NimbusLookAndFeel" );
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (UnsupportedLookAndFeelException e) {
                    e.printStackTrace();
                }
                new auth();
            }
        });
    }
}

public class auth extends JFrame {
    public auth() {
        initComponents();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
    }

你也应该考虑浏览一下,它会让你的代码更容易阅读;p> 在更改外观之前,您已经调用了

initComponents
。这将在这些组件中安装当前安装的外观

无需指导每个组件更新其UI,您只需使用
initComponents
方法交换外观的安装,例如

try {
    UIManager.setLookAndFeel ( "javax.swing.plaf.nimbus.NimbusLookAndFeel" );
} catch (ClassNotFoundException e) {
    e.printStackTrace();
} catch (InstantiationException e) {
    e.printStackTrace();
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (UnsupportedLookAndFeelException e) {
    e.printStackTrace();
}
initComponents();
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
话虽如此,现在。在调用
auth
构造函数之前,您确实应该在EDT的上下文中,而
auth
不应该真正决定外观。如果您想以不同的外观再次使用此框架,会发生什么情况

相反,我们可以做一些更像

public class main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel ( "javax.swing.plaf.nimbus.NimbusLookAndFeel" );
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (InstantiationException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (UnsupportedLookAndFeelException e) {
                    e.printStackTrace();
                }
                new auth();
            }
        });
    }
}

public class auth extends JFrame {
    public auth() {
        initComponents();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
    }

你也应该考虑浏览一下,它会让你的代码更容易阅读;p> 有错误消息吗?没有。。什么都没有,只是当我们试图从main调用auth类时使用的旧java laf有任何错误消息吗?没有。。没什么,只是在我们尝试从main调用auth类时使用了相同的JavaLAF。是的,我一开始尝试了这个方法,效果非常好。但是我认为我们需要在相应的类中声明laf本身。!:)谢谢你,伙计。还有一个问题,如果我有另一门课,我想把它改成LAF呢?只需添加新的class2();到主类就可以了?一旦你安装了look-and-feel,所有新创建的组件都将使用,这就是为什么你首先会遇到问题的原因。所以,是的,只要继续创建对象,它们就会使用相同的外观和感觉。是的,我一开始尝试了这种方法,效果非常好。但是我认为我们需要在相应的类中声明laf本身。!:)谢谢你,伙计。还有一个问题,如果我有另一门课,我想把它改成LAF呢?只需添加新的class2();到主类就可以了?一旦你安装了look-and-feel,所有新创建的组件都将使用,这就是为什么你首先会遇到问题的原因。所以,是的,只要继续创建对象,它们就会使用相同的外观和感觉。