Bloqueando JFrame

7 respostas
Alchemist

Bom dia pessoal, estou com uma pergunta sobre JFrame de iniciante.

Tenho 1 Jframe que dentro dele há um botão, ao clicar no botão ele abre outro JFrame, como eu posso bloquear o primeiro Jframe até o usuario fechar o segundo ?

7 Respostas

ViniGodoy

No lugar de um JFrame, use um JDialog.

Então, antes de abrir o seu JDialog faça:

dialog.setModal(true); dialog.setVisible(true);

Alchemist

Não teria um jeito de fazer um JFrame ?

Felagund

Não.

Se tiver é gambiarra :slight_smile:

Alchemist

Então pessoal criei este metodo aqui para fazer a minha janela:

public JDialog janelaAnotacao(){
		
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		
		JDialog janelaAnotacao = new JDialog();
		janelaAnotacao.setSize(500, 500);
		janelaAnotacao.setResizable(false);
		janelaAnotacao.setModal(true);  
		janelaAnotacao.setLayout(null);
		
		JLabel jlTxtObservacoes = new JLabel("Anotações:");
	    jlTxtObservacoes.setBounds(10, 10, 100, 20);
	    
		jtaCampoObj = new JTextArea();
		jtaCampoObj.setLineWrap(true);
		jtaCampoObj.setWrapStyleWord(true);  
		jtaCampoObj.setDocument(new LimitaCaracteres(1000)); 
		jtaCampoObj.setFont(new Font("Serif", Font.ROMAN_BASELINE, 12)); 
		
		JScrollPane campoObj = new JScrollPane(jtaCampoObj);
		campoObj.setBorder(bordaPreta);
		campoObj.setBounds(10,40,400, 400);
		
		janelaAnotacao.add(jlTxtObservacoes);
		janelaAnotacao.add(campoObj);
		
		janelaAnotacao.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
		janelaAnotacao.setVisible(true);	
		
		return janelaAnotacao;
		
	}

Não sei o que eu fiz de errado no JDialog, ele não esta fechando quando eu clico no fechar :S

ViniGodoy

Adicione a linha:

janelaAnotacao.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);

No lugar da do EXIT_ON_CLOSE

Alchemist

Vini só mais uma duvida!

Eu acabei criando esta classe:

package view;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.Border;

import controller.LimitaCaracteres;

public class vwAnotacao extends JDialog{
	
	private JTextArea anotacaoTextArea;
	private JButton jbOk;
	private JButton jbCancelar;
	
	public vwAnotacao(){
		setSize(500, 500);
		setResizable(false);
		setModal(true);  
		setLayout(null);
		setTitle("Anotações");
		criaTelaAnotacao();
		setLocationRelativeTo(null); 
		setVisible(true);	
	}
	
	private void criaTelaAnotacao(){
		
		Border bordaPreta = BorderFactory.createLineBorder(Color.BLACK);
		
		JLabel jlTxtObservacoes = new JLabel("Anotações:");
	    jlTxtObservacoes.setBounds(10, 10, 100, 20);
	    
	    anotacaoTextArea = new JTextArea();
	    anotacaoTextArea.setLineWrap(true);
	    anotacaoTextArea.setWrapStyleWord(true);  
	    anotacaoTextArea.setDocument(new LimitaCaracteres(1000)); 
	    anotacaoTextArea.setFont(new Font("Serif", Font.ROMAN_BASELINE, 12)); 
		
		JScrollPane campoObj = new JScrollPane(anotacaoTextArea);
		campoObj.setBorder(bordaPreta);
		campoObj.setBounds(10,40,475, 380);
		
		
		jbOk = new JButton("OK");
		jbOk.setBorder(bordaPreta);
		jbOk.setBounds(120, 430, 100, 20);
		
		jbCancelar = new JButton("Cancelar");
		jbCancelar.setBorder(bordaPreta);
		jbCancelar.setBounds(270, 430, 100, 20);
		
		add(jbOk);
		add(jbCancelar);
		add(jlTxtObservacoes);
		add(campoObj);
	}

	public void setJbOk(ActionListener al){
		jbOk.addActionListener(al);
	}
	public void setJbCancelar(ActionListener al){
		jbCancelar.addActionListener(al);
	}
	
}

Porem quando eu chamo os eventos dela n acontece nada, eu tirei o setModal() é ele que não está deixando os eventos funcionarem, como eu posso concertar isto ?

minha chamada desta classe:

vwAnotacao anotacao = new vwAnotacao();
				
				anotacao.setJbOk(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						System.out.println("OK");
					}
				});
	
				anotacao.setJbCancelar(new ActionListener(){
					public void actionPerformed(ActionEvent e){
						System.out.println("CANCELAR");
					}
				});
ViniGodoy

O que acontece é que, como vc pedir, ao deixar o JDialog visível, o Frame de trás para de processar. Então, as duas linhas depois do new não são executadas, até que você feche o Dialog.

Você tem duas soluções possíveis para o seu problema:

  1. Defina os listeners dentro do JDialog, antes de chamar setVisible(true);
  2. Tira o setVisible(true) do seu construtor, e chame-o fora da classe, após colocar os listeners.

Eu, particularmente, faria as duas coisas.

Criado 4 de agosto de 2009
Ultima resposta 6 de ago. de 2009
Respostas 7
Participantes 3