Como esperar pela thread criada para o swing?

3 respostas
Mantu

Olá pessoal!
Por gentileza, executem a seguinte classe:

class Teste{
	public static void main(String args[]) {
		int opt = 0;
		do {
			JFrame f = new JFrame();
			f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			f.setVisible(true);
			opt = JOptionPane.showConfirmDialog(null, "Mais uma vez?");
		} while (opt == JOptionPane.YES_OPTION);
	}
}

Lendo o código, é fácil de intuir qual a minha intenção: Quero mostrar um JFrame até o usuário encher o saco de ficar olhando pra esse JFrame vazio e então fechá-lo. Ao fechar o JFrame, apareceria um JOptionPane perguntando se o usuário quer ficar com cara de bobo novamente olhando praquele JFrame vazio idiota. Se o cara escolher YES, então aparece o JFrame vazio, e o ciclo se repete, blablabla…
Claro que isso não funciona… Creio eu que é por que o JFrame é exibido em uma thread separada.
A minha dúvida é a seguinte:

Espero ter conseguido me expressar… :shock: :?
Valeu!

3 Respostas

T

Um JFrame não é um JDialog, que você pode setar como modal e esperar que seja fechado. Acho que em versões mais novas do Java você pode visualizar um JFrame como modal, mas não sei exatamente a partir de quando.

acopiara

Não sei se entendi o q vc falou!
Mas criei uma classe tosca:

import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class Tosc {
	int opt = 0;

	JFrame f = null;

	boolean executa = false;

	public static void main(String[] args) {
		final Tosc pai = new Tosc();
		do {

			pai.f = new JFrame();
			pai.f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
			pai.f.setVisible(true);
			pai.f.addWindowListener(new java.awt.event.WindowAdapter() {
				public void windowClosing(WindowEvent winEvt) {
					pai.opt = JOptionPane.showConfirmDialog(null,
							"Mais uma vez?");
					pai.executa = false;
				}
			});
			Executa e = pai.new Executa();
			Thread thread = new Thread(e);
			pai.executa = true;
			thread.start();
			try {

				thread.join();
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			pai.f.setVisible(false);
		} while (pai.opt == JOptionPane.YES_OPTION);
		System.exit(0);
	}

	class Executa implements Runnable {
		public void run() {
			while (executa) {

			}
		}

	}

}
Mantu

Então, não se esqueça que a classe que extende JFrame é não-instanciável… :cry:

Criado 17 de janeiro de 2007
Ultima resposta 17 de jan. de 2007
Respostas 3
Participantes 3