为什么我的 Java 程序会创建无限数量的 windows? (使用线程和无 WHILE 循环)

Why does my Java program create an infinite # of windows? (Uses threads and NO WHILE LOOPS)

问题: 所以我试图了解线程如何处理图形,所以我创建了一个程序,该程序应该使用用户线程将屏幕颜色设置为红色。但是,当我 运行 程序时, 它打开我的 JFrame window 无数次,我必须退出程序才能停止 .我如何防止这种情况发生?提前致谢。

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

Class代码

    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();
    }
}

问题出在第 add(new MWT()) 行的 MWT 的构造函数中。所以当你构造一个新的MWT,你创建一个新的JFrame,然后你再次调用MWT(),创建一个新的JFrame,再次调用MWT(),然后很快。不过最终你应该 运行 进入堆栈溢出。

要解决这个问题,您可以扩展 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 的实例

好吧,我找到了你无限产卵的源头windows。您正在实例化您在构造函数中构造的对象。

frame.add(new MWT());

事情是这样的,因为对象没有完全完成构建你的实例,它仍然会关闭并创建它的一个实例,这会导致对 MWT 对象。

如果要添加正在构建的 MWT 对象的 current 实例,可以使用 this 代替:

frame.add(this);