GUI代码中的StackOverflowError

时间:2014-05-01 02:32:45

标签: java swing user-interface frame

知道为什么我的代码没有连接到框架?

框:

import javax.swing.*;
import java.awt.*;

public class CourseGUI extends JFrame {
    public CourseGUI()
    {
        super("CourseGUI Frame");

        JPanel topPane = new TopPanel();
        JPanel topPanel = new JPanel();
        topPanel.setBackground(java.awt.Color.WHITE);
        Dimension d = new Dimension(800,600);

        topPanel.setPreferredSize(d);

        this.setLayout(new BorderLayout());

        this.add(topPanel, BorderLayout.NORTH);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setSize(800,600);

        this.setVisible(true);
    }
    public static void main(String[] args)
    {
        new CourseGUI();
    }

}

面板:

import javax.swing.*;
import java.awt.*;


public class TopPanel extends JPanel {

    public TopPanel() {     
        TopPanel tp = new TopPanel();
        tp.add(new JLabel("Course Info"));
        tp.setSize(300,300);

        tp.setVisible(true);
    }

}

通过面板,我试图将它放在框架的北部,遗憾的是,它不起作用。我是初学者程序员,今年在学校学习这个,我们的老师4天前教我们这个,我不能再困惑了。试图多次得到这方面的帮助,即使是教授,也没有用,有人请帮助我解释。提前谢谢。

1 个答案:

答案 0 :(得分:1)

public class TopPanel extends JPanel {

    public TopPanel() {     
        TopPanel tp = new TopPanel();
        tp.add(new JLabel("Course Info"));
        tp.setSize(300,300);

        tp.setVisible(true);
    }

}

通过在自己的构造函数中创建TopPanel对象,您将导致几乎无限的递归:

  • 您的TopPanel构造函数将创建一个新的TopPanel对象
    • 其构造函数将创建一个新的TopPanel对象
      • 其构造函数将创建一个新的TopPanel对象
        • 其构造函数将创建一个新的TopPanel对象,其构造函数,....
          • ...等 - 递归,直到你的记忆耗尽。不要这样做。

相反,不要这样做:

public class TopPanel extends JPanel {

    public TopPanel() {     
        // get rid of the recursion
        // TopPanel tp = new TopPanel();

        // add the label to the current TopPanel object, the "this"
        add(new JLabel("Course Info"));

        // setSize(300,300); // generally not a good idea

        // tp.setVisible(true); // not needed
    }

    // this is an overly simplified method. You may wish to calculate what the 
    // preferred size should be, or simply don't set it and let the components
    // size themselves.
    public Dimension getPreferredSize() {
       return new Dimension(300, 300); 
    }

}

修改
此外,虽然没有错误,但是:

   JPanel topPane = new TopPanel();
   JPanel topPanel = new JPanel();

非常令人困惑,因为两个JPanel变量足够接近我们的名字,更重要的是混淆了你未来的自我。您将需要使用更多逻辑和不同的变量名称。