Как закрыть Java-кадр с потоками - PullRequest
8 голосов
/ 16 февраля 2010

У меня есть 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 голосов
/ 16 февраля 2010

Хотя AWT должен быть потокобезопасным, на самом деле это не так. Поэтому я предлагаю, как и Swing, выполнить все манипуляции с графическим интерфейсом в потоке диспетчеризации событий AWT (EDT).

Для этой конкретной задачи, javax.swing.Timer должен добиться цели. (Хотя он находится в пакете javax.swing, в нем нет ничего специфичного для Swing.)

Кроме того, я бы настоятельно рекомендовал не расширять классы, если только вам это не нужно. Существует очень мало причин для расширения Thread или Frame (к сожалению, существует множество плохих примеров и старых руководств).

3 голосов
/ 16 февраля 2010

в вашем фрейме запускает новый поток и передает ему ваш экземпляр фрейма, а через определенный промежуток времени закрывает его.

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();
2 голосов
/ 16 февраля 2010

Вы можете использовать Таймер и позволить ему позаботиться о нити за вас.

...