在不同的类中使用JFrame.add函数

时间:2017-06-27 20:19:59

标签: java swing

我在完成这项任务时遇到了麻烦。我有2个班级:

public class MainJFrame extends JFrame implements ActionListener {

public Labels labels;

public MainJFrame() {


    setSize(1024, 960);
    setTitle("er");
    setLayout(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    labels = new Labels();
    labels.addLabels();

}

public static MainJFrame application;
public static void main(String[] args) {
        application = new MainJFrame();
        application.setVisible(true);
}


}

和第二课:

public class Labels {


public JLabel l_acceleration; 


public void addLabels() {   
   MainJFrame.application.add(MainJFrame.application.labels.l_acceleration);    
}


public Labels() {

    l_acceleration = new JLabel("acc");
        l_acceleration.setBounds(90, 90, 90, 20);

}

我收到了这个错误:

Exception in thread "main" java.lang.NullPointerException
    at gui.Labels.addLabels(Labels.java:12)
    at cardmaker.MainJFrame.<init>(MainJFrame.java:16)
    at cardmaker.MainJFrame.main(MainJFrame.java:22)

那里有什么问题?我无法在网络上的任何地方找到解决方案。我认为这个问题就在附近:     MainJFrame.application.add(MainJFrame.application.labels.l_acceleration); 为什么我不能在构造函数中使用此函数? 有没有办法可以做到这一点?我真的需要它。

2 个答案:

答案 0 :(得分:1)

MainJFrame课程中,您声明了一个名为application的字段。

public static MainJFrame application;

由于这是一个静态字段,因此当您的应用程序到达main方法时,此字段已自动使用默认值null进行初始化。然后在你的主要课程中你给出这个指示:

application = new MainJFrame();

application分配给新值之前,MainJFrame的构造函数必须运行完成。构造函数启动并最终创建一个新的Labels对象并在其中调用addLabels

问题是,addLabels方法调用MainJFrame.application.add。请注意,它指的是MainJFrame.application,但由于构造函数尚未完成,MainJFrame.application的值尚未从默认值{{1}更改所以你得到一个NullPointerException。

解决这个问题的一种方法是将对MainJFrame的引用直接传递给Labels并以这种方式引用它:

null

...并在构造函数中调用public void addLabels(MainJFrame f) { f.add(f.labels.l_acceleration); } ,如下所示:

addLabels

请注意,这仍然不是很好的代码,但这是另一天的更高级主题。 :)

答案 1 :(得分:0)

public static void main(String[] args) {
    application = new MainJFrame();
    Labels j = new Labels();
    j.addLabels();
    application.setVisible(true); 

}

您可以使用此代码解决问题。

而不是在MainJFrame()中调用addLabels(),而不是在main()中调用它。

相关问题