Trabalhando com mais de uma janela

Olá, sou novo aqui e estou postando minha primeira dúvida.
Qual é o melhor jeito pra se trabalhar com mais de uma janela? Por exemplo, eu seleciono fazer um cadastro no meu programa principal, esta função chama uma segunda janela para que seja efetuado um cadastro e, poesteriormente, retorne para a janela principal.
Eu desconfio que seja tendo uma classe para cada janela, mas não tenho certeza.
Uma outra dúvida que eu já tentei e não consegui fazer foi deixar a janela principal inativa enquanto a de cadastro não fosse resolvida. Eu usei o setEnabled(false) assim que chamasse a segunda janela, mas da segunda janela eu não consegui setar o como true a principal novamente.
Por favor me ajudem, abraços!

Uma maneira interessante de se fazer isso, é ter um JFrame como janela principal e as outras janelas implementadas em JDialogs.

http://www.guj.com.br/posts/list/55710.java#292687

Usando JDialog, pode deixá-lo como Modal. Deste modo terá o efeito citado.

JFrame + JDesktopPane e no fim você trabalhe com JInternalFrames…

Acho legal assim…

Eric, estava fazendo uns testes e não surtiu o efeito que eu queria.

		cadastro.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				JDialog dialog = new JDialog();
				dialog.setVisible(true);
				dialog.setModal(true);
				dialog.setSize(150,150);
				dialog.setLocation(200,200);				
			}
		});

Eu ainda consigo mecher na janela principal enquanto o JDialog está aberto.

Primeiro carregue os atributos desejados e em seguida torne o diálogo visível. Passe a linha dialog.setVisible(true); para o final do método.

OMG, DEU CERTO!
Eu sou mto noob nisso mesmo, mas por favor me explica qual é a diferença?

Sinceramente, não sei explicar tecnicamente o que ocorre com estes métodos.

Mas por exemplo, esta questão setModal, seria ruim modificar este atributo com o diálogo visível, pois o que iria garantir que eu não tente fazer isso já com o foco fora do JDialog?

A propósito, geralmente se especifica diretamente no construtor, que recebe o Frame ou o Dialog “pai” e um valor booleano indicando se é modal ou não. A documentação do método setModal mesmo diz que este método é obsoleto.

eu tentei, mas não sei o que vai nesse owner.
tentei o nome da variavel que instancia o JFrame e tentei o nome da classe tb.

Deveria funcionar passando a referência do JFrame. Poste a parte que está chamando o JDialog.

[code]import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

public class Teste extends JFrame {

JMenuBar menubar;
JMenu arquivo;
JMenuItem cadastro;

public Teste(){
	this("Sistema");
}

public Teste(String n){
	setTitle(n);
	setVisible(true);
	setDefaultCloseOperation(EXIT_ON_CLOSE);
	setSize(300,200);
	setLocationRelativeTo(null);
	menubar = new JMenuBar();
	add(menubar);
	arquivo = new JMenu("Arquivo");
	menubar.add(arquivo);
	cadastro = new JMenuItem("Cadastro");
	arquivo.add(cadastro);
	cadastro.addActionListener(new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			JDialog dialog = new JDialog();
			dialog.setModal(true);
			dialog.setSize(150,150);
			dialog.setLocationRelativeTo(null);
			dialog.setVisible(true);

		}
	});
}

	public static void main(String[] args) {
	Teste janela = new Teste("Programinha do mal");
}

}
[/code]

O que eu devo fazer?

JDialog dialog = new JDialog(Teste.this, true); // O primeiro parâmetro passa a referência ao frame (owner) e o segundo diz se é modal ou não. dialog.setSize(150,150); dialog.setLocationRelativeTo(Teste.this); // Posiciona o dialog em relação ao frame. dialog.setVisible(true);

desculpe a minha ignorancia mas Teste.this retorna o q?
E o setLocationRelativeTo(), o que ele faz exatamente? A unica coisa q eu sei eh que com null como parametro ele fica no centro

A referência ao objeto do tipo Teste.

Como o JDialog está sendo criado em uma classe anônima, se passar “this” diretamente, vai fazer referência a classe anônima, por isso o Teste.this, assim a referência passada ao JDialog vai ser do objeto Teste.

setLocationRelativeTo, posiciona a janela em relação ao componente passado, se passar o frame, ele fica centralizado dentro da área do frame, se passar null, ele fica centralizado na tela.

e pq não só Teste?

Por que é preciso passar a referência de um objeto que foi instanciado na memória, e não a classe. O this é quem faz esta referência.

É só pensar que a classe é o modelo do objeto. Só existe uma classe Teste, mas posso ter diversos objetos criados a partir desta classe. O this de cada objeto retorna um referência dele mesmo. Se passar apenas o nome da classe, não há como saber de qual objeto estamos falando.

e pq eh tao importante setar o owner?

O owner determina o dono do JDialog, ou seja, o diálogo ficará sempre na frente da janela.

Faça o seguinte teste: Abra uma janela qualquer (pode ser qualquer programa), abra seu JFrame e chame o JDialog. Mude o foco para a janela qualquer e depois volte o foco para seu JFrame.

Se o owner não estiver especificado, só o JDialog virá para frente da tela (caso esteja como modal) ou só o frame virá para frente (caso não esteja como modal). Se o owner estiver especificado, eles andarão sempre juntos.

OBRIGADO!