При необходимости в типах фиксированного размера используйте типы как uint32_t (целое число без знака 32 бита) определенный в stdint.h. Они определяются в C99.
Ответ, который вы выбрали, немного неудобен. Использование Thread.sleep (1000) будет проверять состояние окна каждую секунду. Это не проблема производительности, а просто плохой стиль кода. И у вас может быть время отклика в одну секунду.
Этот код немного лучше.
private static Object lock = new Object();
private static JFrame frame = new JFrame();
/**
* @param args
*/
public static void main(String[] args) {
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
frame.setVisible(true);
Thread t = new Thread() {
public void run() {
synchronized(lock) {
while (frame.isVisible())
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Working now");
}
}
};
t.start();
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) {
synchronized (lock) {
frame.setVisible(false);
lock.notify();
}
}
});
t.join();
}
Все компоненты Swing, включая JFrame, управляются одним потоком, который называется потоком отправки событий или EDT. (Можно вызывать методы объектов Swing из других потоков, но обычно это небезопасно, за исключением нескольких случаев, которые здесь не имеют отношения.)
Вы, вероятно, добьетесь здесь того, что хотите, поместив код проверки и выполнения данных в свой собственный объект, который в противном случае совершенно не осознает внешний мир. Затем вызовите его из одного из двух других объектов: один управляет графическим интерфейсом пользователя, а другой работает в «автоматическом режиме».
Вы можете сделать ссылку из вашего потока на JFrame. Затем установите для операции закрытия JFrame по умолчанию значение HIDE_ON_CLOSE . Если JFrame закрыт, вы можете остановить поток.
Пример кода:
import java.awt.Dimension;
import javax.swing.JFrame;
public class FrameExample extends JFrame {
public FrameExample() {
setSize(new Dimension(100, 100));
setDefaultCloseOperation(HIDE_ON_CLOSE);
setVisible(true);
}
private static class T implements Runnable {
private FrameExample e;
public T(FrameExample e) {
this.e = e;
}
@Override
public void run() {
while (true) {
if (e.isVisible()) {
// do the validation
System.out.println("validation");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
break;
}
}
}
}
}
public static void main(String[] args) {
FrameExample frameExample = new FrameExample();
new Thread(new T(frameExample)).start();
}
}