问题:因此,我试图了解线程如何与图形一起使用,因此创建了一个程序,该程序应使用用户线程将屏幕的颜色设置为红色。但是,当我运行该程序时,它会无限次打开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())构造函数。因此,当您构造一个新的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实例

08-18 05:14