Problema com JFrame e JDialog modal[RESOLVIDO]

9 respostas
M

Bom dia pessoal. Estou tendo o seguinte problema:

Tenho um JFrame que chama um JDialog modal. Até ai tudo bem. Porém depois de trocar de aplicativo (com alt+tab por exemplo), se eu voltar ao programa só aparecerá o JDialog, ficando o JFrame “escondido”. Alguém sabe alguma maneira de contornar esse problema?

9 Respostas

Z

Blz,
passa o JFrame como parent do JDialog.

Falou…

M

zongman:
Blz,
passa o JFrame como parent do JDialog.

Falou…

Valeu pela ajuda, só acho que não dá pra eu fazer isso porque no caso eu tenho uma classe que herda a JDialog.

B

cria um construtor que recebe o frame e chama super(Frame) do JDialog que tá implementando!

M

Obrigado pela ajuda, mas não deu certo. Acho que faltaram detalhes na minha explicação:

Tenho um JFrame que é a tela principal. Dentro dela tenho um JPanel. Esse JPanel chama o JDialog, que é modal. Se eu dou um alt+tab e troco de aplicação, o JFrame(junto com o JPanel e tudo mais que estiver nele) some e só volta a aparecer se eu fechar o JDialog. Eu já procurei bastante mas ainda não achei a resposta. Mas agradeço a boa vontade dos que me ajudaram até aqui.

B

Entedi mais ainda a duvida… E é isso msm que tão respondendo no topico… rs

O que falta é o teu DIalog saber que o Owner dele é o Frame que voce esta chamando ele…

Na class JDialog que vc extende, faz algo do tipo MinhaDialog extends JDialog, certo?

É so criar um construtor:

public MinhaDialog(Frame fr){
   super(fr);
}

Ou então vc nao explicou e piorou a sua explicação, pq eu to entendo isso. :smiley:

M
brlima:
Entedi mais ainda a duvida... E é isso msm que tão respondendo no topico... rs

O que falta é o teu DIalog saber que o Owner dele é o Frame que voce esta chamando ele...

Na class JDialog que vc extende, faz algo do tipo MinhaDialog extends JDialog, certo?

É so criar um construtor:
public MinhaDialog(Frame fr){
   super(fr);
}

Ou então vc nao explicou e piorou a sua explicação, pq eu to entendo isso. :D

Bom, entendi o que você disse e acho que está tudo certo, só não sei como passar para o JDialog o Frame. Abaixo o código:

public class TelaPrincipal extends JFrame {

        private JDesktopPane desktopPane = null;
	private JMenuBar jJMenuBar = null;
	private JMenu jMenu = null;
	private JMenuItem jMenuItem = null;
	private JPanel jContentPane = null;
	
	public TelaPrincipal() {
		super();
		desktopPane = new JDesktopPane();
		desktopPane.setFocusTraversalKeysEnabled(false);
		initialize();
		
	}

	private void initialize() {
		this.add(desktopPane);
		this.setJMenuBar(getJJMenuBar());
		this.setContentPane(desktopPane);
		this.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		this.getContentPane().add(getJContentPane());
		this.setTitle("Teste v0.1");
		this.setBounds(new java.awt.Rectangle(0,0,796,713));
		MetalLookAndFeel.setCurrentTheme(new OceanTheme());
		this.setFocusableWindowState(true);
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			GridLayout gridLayout = new GridLayout();
			gridLayout.setRows(1);
			jContentPane = new JPanel();
			jContentPane.setLayout(gridLayout);
		}
		return jContentPane;
	}

	private JMenuBar getJJMenuBar() {
		if (jJMenuBar == null) {
			jJMenuBar = new JMenuBar();
			jJMenuBar.add(getJMenu());
		}
		return jJMenuBar;
	}

	private JMenu getJMenu() {
		if (jMenu == null) {
			jMenu = new JMenu();
			jMenu.setText("Arquivo");
			jMenu.setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 12));
			jMenu.add(getJMenuItem());
		}
		return jMenu;
	}

	private JMenuItem getJMenuItem() {
		if (jMenuItem == null) {
			jMenuItem = new JMenuItem();
			jMenuItem.setText("Abrir");
			jMenuItem.setFont(new java.awt.Font("Dialog", java.awt.Font.PLAIN, 12));
			jMenuItem.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					jContentPane.add(new MeuJDialog(super(Frame)));
				}
			});
		}
		return jMenuItem;
	}
	
	public static void main(String[] args) {
		TelaPrincipal tela = new TelaPrincipal();
		tela.setVisible(true);
	}

}

O erro aparece na linha abaixo.

jContentPane.add(new MeuJDialog(super(Frame)));

Ali no Frame já tentei this e TelaPrincipal(nome da classe), mas não deu certo. Não repara muito no código que eu vou começar a ver Swing esse semestre e to fazendo isso de metido mesmo :D

M

Bom pessoal, o código funcionou. Obrigado a todos que ajudaram. Só mais uma coisa. Existe um jeito de passar o JFrame para o JDialog sem ser pelo construtor?

B
jContentPane.add(new MeuJDialog(super(Frame)));

Que que é isso aqui???
Isso aí não vai mostrar nunca uma JDIalog… rsrs

O correto seria

MeuJDialog d = new MeuJDialog(this);
d.setModal(true);
d.setVisible(true);

Não precisa adicionar nada de janela no ContentPane do frame… =/

E sobre passar pelo construtor, sim, somente pelo contrutor, pois o construtor da JDIalog pede o Owner logo no inicio…

M

brlima:
jContentPane.add(new MeuJDialog(super(Frame)));
Que que é isso aqui???
Isso aí não vai mostrar nunca uma JDIalog… rsrs

O correto seria

MeuJDialog d = new MeuJDialog(this);
d.setModal(true);
d.setVisible(true);

Não precisa adicionar nada de janela no ContentPane do frame… =/

E sobre passar pelo construtor, sim, somente pelo contrutor, pois o construtor da JDIalog pede o Owner logo no inicio…

O jeito é fazer no construtor então hehe. Obrigado pela ajuda. Foi realmente muito útil.

Criado 11 de agosto de 2008
Ultima resposta 12 de ago. de 2008
Respostas 9
Participantes 3