如何使用线程关闭Java窗体

8

我有一个Java框架,我希望在3或4秒后自动关闭它。我发现我必须使用线程,但我不知道如何做到这一点,以下是我的代码中的一个示例:

package intro;

import java.awt.*;
import java.io.IOException;
//import view.LangMenu;

public class IntroClass extends Frame {

    private int _screenWidth = 0;
    private int _screenHeight = 0;
    private int _screenCenterx = 0;
    private int _screenCentery = 0;

    //private static final String SOUND_PATH="/sounds/introSound.midi";
    public IntroClass() {
        Toolkit thisScreen = Toolkit.getDefaultToolkit();
        Dimension thisScrrensize = thisScreen.getScreenSize();

        _screenWidth = thisScrrensize.width;
        _screenHeight = thisScrrensize.height;
        _screenCenterx = _screenWidth / 2;
        _screenCentery = _screenHeight / 2;
        setBackground(Color.pink);
        Label lbl = new Label("Welcome To Dots Game. Samaneh Khaleghi", Label.CENTER);
        add(lbl);
        setUndecorated(true);
        setLocation((_screenCenterx*50)/100,_screenCentery-(_screenCentery*50)/100);
        setSize((_screenWidth * 50) / 100, (_screenHeight * 50) / 100);

        WaitClass r = new WaitClass();
        r.start();
        view.DotsBoardFrame d=new view.DotsBoardFrame();
                main.Main.showScreen(d);
    }

    class WaitClass extends Thread {

        boolean running = true;

        public void run() {
            while (running) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }                
            }
        }
    }
}
3个回答

6
尽管AWT被认为是线程安全的,但实际上并不是。因此,我建议像Swing一样,在AWT事件分派线程(EDT)上进行所有GUI操作。
对于这个特定的任务,javax.swing.Timer应该可以胜任。(尽管它在javax.swing包中,但它与Swing无关。)
此外,我强烈建议不要扩展类,除非你真的必须这样做。几乎没有理由去扩展Thread或Frame(不幸的是,有很多糟糕的例子和旧的教程存在)。

3

在您的框架中启动一个新线程,并将其传递给您的框架实例,在特定时间段后关闭它。

class MyThread extends Thread {

  private JFrame frame;
  //-- getters and setters for frame

  public void run() {
    Thread.sleep(1000); //close the frame after 1 second.
    frame.close();
  }

}

在您的JFrame类中,特别是在构造函数中,请添加以下代码行:

MyThread th = new MyThread();
th.setFrame(this);
th.start();

谢谢Omar,我会尝试的 :) - user261002
4
除了EDT之外的任何线程操作AWT组件是一个不好的想法。 - Lawrence Dol
1
@user261002:如果它能工作,那就把功劳归给Omar先生吧。你问了9个问题,但是你没有接受任何答案。 - Venkat

2
您可以使用一个计时器(Timer),让它为您处理线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接