У меня есть кадр 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();
}
}
}
}
}
в вашем фрейме запускает новый поток и передает ему свой экземпляр фрейма, а через определенный период времени закрывает его.
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();
Хотя AWT должен быть потокобезопасным, на самом деле это не так. Поэтому я предлагаю, как и Swing, выполнять все манипуляции с графическим интерфейсом в потоке диспетчеризации событий AWT (EDT).
Для этой конкретной задачи javax.swing.Timer
должен помочь. (Хотя он находится в пакете javax.swing
, в нем нет ничего специфичного для Swing.)
Также я настоятельно рекомендую не расширять классы, если в этом нет необходимости. Очень мало причин когда-либо расширять Thread
или Frame
(к сожалению, есть много плохих примеров и старых руководств).
Вы можете использовать Таймер и позволить ему позаботиться о потоках за вас.