为什么我的Java程序会创建无限数量的Windows?(使用线程,没有任何循环)

imgolden62

问题:因此,我试图了解线程如何与图形一起使用,因此创建了一个程序,该程序应使用用户线程将屏幕的颜色设置为红色。但是,当我运行该程序时,它会无限次打开JFrame窗口,并且我必须退出该程序才能停止如何防止这种情况发生?提前致谢。

更新:所以很多人向我解释了罪魁祸首(现在已注释):frame.add(new MWT),它反复调用构造函数并创建一个新对象。但是,如何在没有任何静态实例的情况下简单地将Canvas添加到JFrame?谢谢

班级代码

    public class MWT  extends Canvas implements Runnable
{
    private Thread fast;
    public static void main(String [] args){
        MWT draw = new MWT();

    }
    public MWT(){
        JFrame frame = new JFrame("Thread Drawings");
        frame.setVisible(true);
        frame.setFocusable(true);
        frame.setSize(600,500);
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        // CULPRIT
        //frame.add(new MWT());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        start();
    }

    private void stop() {
        if (fast== null){
            return;
        }
        else{
            System.exit(0); 
        }

    }

    private void start() {
        if (fast != null){
            return;
            }
        else{
            fast = new Thread(this);
            fast.start();
        }

    }

    @Override
    public void run() {
        BufferStrategy bs = this.getBufferStrategy();
        if (bs == null){
            createBufferStrategy(3);
            return;
        }
        Graphics g = bs.getDrawGraphics();
        Graphics2D g2d = (Graphics2D) g;
        render(g2d);
    }
    public void render(Graphics2D g2d){
        g2d.setColor(Color.RED);
        g2d.fillRect(0, 0,600,500);
        stop();
    }
}
亚历克斯

问题在于MWT该行的构造函数add(new MWT())因此,当构造一个new时MWT,您将创建一个new JFrame,然后MWT()再次调用,创建一个new JFrameMWT()再次调用,依此类推。最终,您应该遇到堆栈溢出的问题。

为了解决这个问题,您可以扩展JFrame,并在其构造函数中添加其内部的组件,也可以仅添加当前实例。

public class MWT extends Canvas implements Runnable {
    // change the constructor so it doesn't make a new JFrame
    // change the constructor so it doesn't add a new instance to the JFrame
    // leave the rest unchanged
}

public class ThreadedGraphicsDemo extends JFrame {
    private MWT mwt;

    public ThreadedGraphicsDemo(MWT mwt) {
        this.mwt = mwt;

        add(mwt);
        // set exit behavior, size, pack, visible etc
    }
}

public class Demo {
    public static void main(String[] args) {
        MWT mwt = new MWT();
        ThreadedGraphicsDemo tgd = new tgd(mwt);
    }
}

这种方法将使您可以轻松更改GUI和将来的行为。

快速解决方案:add(new MWT())将其更改add(this)为添加实例MWT的实例,而不是将其更改为

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么即使我的程序没有创建任何新对象,堆利用率也会随着时间的推移而增加?

来自分类Dev

Java程序保持无限循环,没有任何错误消息

来自分类Dev

当我从atexit处理程序调用exit时,为什么没有得到无限循环?

来自分类Dev

为什么我的程序无限循环?

来自分类Dev

为什么我的Perl线程陷入无限循环?(线程::队列)

来自分类Dev

谁能告诉我为什么我的程序会无限循环?

来自分类Dev

为什么我的if语句会创建一个无限循环?

来自分类Dev

当char数组被过量填充时,为什么我的程序会陷入无限循环?

来自分类Dev

为什么下面的程序会进行无限循环?

来自分类Dev

为什么这个bash程序会陷入无限循环?

来自分类Dev

为什么我的代码会导致无限循环?

来自分类Dev

为什么我会陷入无限循环?

来自分类Dev

为什么我的线程没有死?

来自分类Dev

在Java中创建多个线程时,为什么没有调用系统调用来创建线程?

来自分类Dev

为什么我没有收到错误在此Java for循环?

来自分类Dev

为什么在使用Ajax帮助程序时会创建动作无限循环?

来自分类Dev

无法找出为什么我的程序陷入无限循环

来自分类Dev

为什么我的程序运行无限循环?蟒蛇

来自分类Dev

为什么didSet中没有无限循环?

来自分类Dev

为什么我在 Javascript 中的 for 循环没有改变变量数量?

来自分类Dev

为什么在没有“命令”的情况下从cd(shell函数)调用cd(内置)会导致无限循环?

来自分类Dev

为什么我的Java程序没有运行?

来自分类Dev

为什么输出会进入无限循环

来自分类Dev

为什么会陷入无限循环?

来自分类Dev

为什么 for 会产生无限循环?

来自分类Dev

For 循环为什么会无限运行?

来自分类Dev

为什么Java无限循环是可能的?对此有什么建议

来自分类Dev

我想知道为什么我的程序没有在我的 while 循环中停止

来自分类Dev

为什么我的每个循环都没有返回任何东西?

Related 相关文章

  1. 1

    为什么即使我的程序没有创建任何新对象,堆利用率也会随着时间的推移而增加?

  2. 2

    Java程序保持无限循环,没有任何错误消息

  3. 3

    当我从atexit处理程序调用exit时,为什么没有得到无限循环?

  4. 4

    为什么我的程序无限循环?

  5. 5

    为什么我的Perl线程陷入无限循环?(线程::队列)

  6. 6

    谁能告诉我为什么我的程序会无限循环?

  7. 7

    为什么我的if语句会创建一个无限循环?

  8. 8

    当char数组被过量填充时,为什么我的程序会陷入无限循环?

  9. 9

    为什么下面的程序会进行无限循环?

  10. 10

    为什么这个bash程序会陷入无限循环?

  11. 11

    为什么我的代码会导致无限循环?

  12. 12

    为什么我会陷入无限循环?

  13. 13

    为什么我的线程没有死?

  14. 14

    在Java中创建多个线程时,为什么没有调用系统调用来创建线程?

  15. 15

    为什么我没有收到错误在此Java for循环?

  16. 16

    为什么在使用Ajax帮助程序时会创建动作无限循环?

  17. 17

    无法找出为什么我的程序陷入无限循环

  18. 18

    为什么我的程序运行无限循环?蟒蛇

  19. 19

    为什么didSet中没有无限循环?

  20. 20

    为什么我在 Javascript 中的 for 循环没有改变变量数量?

  21. 21

    为什么在没有“命令”的情况下从cd(shell函数)调用cd(内置)会导致无限循环?

  22. 22

    为什么我的Java程序没有运行?

  23. 23

    为什么输出会进入无限循环

  24. 24

    为什么会陷入无限循环?

  25. 25

    为什么 for 会产生无限循环?

  26. 26

    For 循环为什么会无限运行?

  27. 27

    为什么Java无限循环是可能的?对此有什么建议

  28. 28

    我想知道为什么我的程序没有在我的 while 循环中停止

  29. 29

    为什么我的每个循环都没有返回任何东西?

热门标签

归档