【问题标题】:how to close a java frame with threads如何用线程关闭java框架
【发布时间】:2011-01-17 13:31:25
【问题描述】:

我有一个 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();
                }                
            }
        }
    }
}

【问题讨论】:

    标签: java multithreading awt frame


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢奥马尔,我会试试的:)
    • 从除 EDT 之外的任何线程操作 AWT 组件的坏主意。
    • @user261002:如果它的工作方式归功于奥马尔这个人。您问了 9 个问题,但没有接受任何回答。
    【解决方案2】:

    虽然 AWT 应该是线程安全的,但实际上并非如此。所以我建议,像 Swing 一样,在 AWT 事件调度线程 (EDT) 上执行所有 GUI 操作。

    对于这个特定的任务,javax.swing.Timer 应该可以解决问题。 (虽然它在 javax.swing 包中,但没有任何 Swing 特定的内容。)

    另外我强烈建议不要扩展课程,除非你真的必须这样做。几乎没有理由扩展 ThreadFrame(不幸的是,那里有很多不好的示例和旧教程)。

    【讨论】:

      【解决方案3】:

      您可以使用Timer 并让它为您处理线程。

      【讨论】:

        猜你喜欢
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 2010-09-08
        • 2011-04-17
        • 1970-01-01
        相关资源
        最近更新 更多