【发布时间】:2016-08-04 00:09:54
【问题描述】:
我有一个JPanel,它实现了Runnable 接口和overrides run() 方法。在我的JPanel 的构造函数中,我初始化了Thread 的private 类(JPanel)实例,它以new MyPanel 为参数。
在这条线上,我得到了一个Exception in thread "main" java.lang.StackOverflowError。
之后出现的错误:
at java.awt.Component.setForeground(Unknown Source)
at javax.swing.JComponent.setForeground(Unknown Source)
at javax.swing.LookAndFeel.installColors(Unknown Source)
at javax.swing.LookAndFeel.installColorsAndFont(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installDefaults(Unknown Source)
at javax.swing.plaf.basic.BasicPanelUI.installUI(Unknown Source)
at javax.swing.JComponent.setUI(Unknown Source)
at javax.swing.JPanel.setUI(Unknown Source)
at javax.swing.JPanel.updateUI(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
at javax.swing.JPanel.<init>(Unknown Source)
然后:
at MyPanel.<init>(MyPanel.java:39)
at MyPanel.<init>(MyPanel.java:45)
第 39 行是我的 JPanel 构造函数,第 45 行是 Thread 类的初始化代码,即 this.generateBallsThread = new Thread(new MyPanel());
这里只放了与问题代码相关的内容。
MyPanel.java:
public class MyPanel extends JPanel implements KeyListener,Runnable
{
private static final long serialVersionUID = 1L;
private static final Color BACKGROUND_COLOR = Color.WHITE;
private static final Color NPC_BALLS_COLOR = Color.RED;
// The player is an oval
private int playerRadius = 25;
private int playerX;
private int playerY;
// True - first player position, false - otherwise
private boolean playerPosition = true;
// Array of all the balls threads
private ArrayList<BallThread> balls = new ArrayList<BallThread>();
private Thread generateBallsThread;
public MyPanel()
{
this.setBackground(MyPanel.BACKGROUND_COLOR);
this.setFocusable(true);
this.addKeyListener(this);
this.generateBallsThread = new Thread(new MyPanel()); // StackOverflowError
generateBallsThread.start();
}
}
我很困惑。这就是你使用Runnable 接口的方式,那么java 想从我这里得到什么?
【问题讨论】:
-
你递归调用
MyPanel的构造函数,因为你得到StackOverflowError
标签: java multithreading swing exception stack-overflow