代码之家  ›  专栏  ›  技术社区  ›  God

java.lang.StackOverflowError在JPanel中实现Runnable-java Swing

  •  0
  • God  · 技术社区  · 9 年前

    我有一个 JPanel 其实现 Runnable 接口和 overrides run() 方法在我的构造函数中 面板 我初始化 private 等级( 面板 )的实例 Thread 作为参数a 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行是我的 面板 构造函数,第45行是类的初始化代码 线 这是 this.generateBallsThread = new Thread(new 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();
        }
    }
    

    我很困惑。这是您使用 可运行的 接口,那么什么 java 我想要什么?

    3 回复  |  直到 9 年前
        1
  •  3
  •   Jeremy Hanlon    9 年前

    代替 new MyPanel() 具有 this 。这将停止导致堆栈溢出的无限递归调用

        2
  •  2
  •   Ashu    9 年前

    您的代码将进入无限循环,因为 这generateBallsThread=新线程(new MyPanel()),因为您正在MyPanel类的构造函数中创建该对象,它将再次调用同一构造函数。

        3
  •  1
  •   intboolstring    9 年前

    为什么你会得到一个SO例外? 的构造函数 MyPanel 类创建另一个 我的面板 。这会导致类继续创建,直到超出堆栈绑定,从而导致堆栈溢出。