Как я заставляю поток ожидать JFrame для закрытия в Java?

При необходимости в типах фиксированного размера используйте типы как uint32_t (целое число без знака 32 бита) определенный в stdint.h. Они определяются в C99.

17
задан A Jackson 27 August 2009 в 15:06
поделиться

3 ответа

Ответ, который вы выбрали, немного неудобен. Использование 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();
}
25
ответ дан 30 November 2019 в 12:44
поделиться

Все компоненты Swing, включая JFrame, управляются одним потоком, который называется потоком отправки событий или EDT. (Можно вызывать методы объектов Swing из других потоков, но обычно это небезопасно, за исключением нескольких случаев, которые здесь не имеют отношения.)

Вы, вероятно, добьетесь здесь того, что хотите, поместив код проверки и выполнения данных в свой собственный объект, который в противном случае совершенно не осознает внешний мир. Затем вызовите его из одного из двух других объектов: один управляет графическим интерфейсом пользователя, а другой работает в «автоматическом режиме».

2
ответ дан 30 November 2019 в 12:44
поделиться

Вы можете сделать ссылку из вашего потока на 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();
    }
} 
2
ответ дан 30 November 2019 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: