Como travar uma tela até que a mensagem seja fechada?

3 respostas
pauloeduardo2906

Eu criei uma aplicação em que eu preciso exibir uma simples mensagem com apenas um botão ok e que ela seja fechado ao apertar esse botão, sendo que se eu clicar o botão que seria para exibir essa mensagem mais de uma vez, será criado mais de uma mensagem, eu queria travar a tela anterior até que seja clicado o botão pra fechar a mensagem!!!
Eu procurei no forúm algo que me ajudasse e achei que seria melhor usar o JDialog com o setModal!! Encontrei o seguinte exemplo:

frmCadastros frmc = new frmCadastros();  
        JDialog dia = new JDialog();  
        dia.setModal(true);  
        dia.setContentPane(frmc.getContentPane());  
        dia.setBounds(frmc.getBounds());  
        dia.setUndecorated(true);  
        dia.setVisible(true);

sendo que ao clicar no ok para fechar a mensagem ela não fecha, o dispose(); não funciona!!! Alguém sabe o que pode ser feito?

3 Respostas

al.barbosa

Paulo,

O JDialog deve ser chamado de dentro de um evento do frmCadastros.
Se for só para exibir uma mensagem com um botão OK, você pode usar JOptionPane.showMessageDialog() - fica mais fácil.
Se a sua janela de mensagem for mais complexa, uma forma de fazer é criar uma classe que estenda JDialog. Aí você precisa criar o botão OK e programar o evento para ele.

Abaixo um exemplo que cria as janelas de mensagem das duas formas:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

public class FramePrincipal extends JFrame {
  
    public FramePrincipal(){
        setLayout(new FlowLayout());
        
        JButton btAbrir = new JButton("Abrir Janela");
        btAbrir.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                abrirMensagem();
            }
        });
        add(btAbrir);
        
        JButton btMessage = new JButton("Mensagem");
        btMessage.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "Mensagem com showMessageDialog.");
            }
        });
        add(btMessage);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 300);
    }
    
    private void abrirMensagem(){
        Mensagem ms = new Mensagem(this);
        ms.setVisible(true);
    }
    
    public static void main(String[] args) {
        FramePrincipal fp = new FramePrincipal();
        fp.setVisible(true);
    }
}
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;

public class Mensagem extends JDialog {
  
    public Mensagem(Frame owner){
        super(owner, "Titulo da Janela");
        setLayout(new FlowLayout());
        setModal(true);
        add(new JLabel("Coloque aqui a mensagem"));
        JButton btFechar = new JButton("OK");
        btFechar.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                fechar();
            }
        });
    	
        add(btFechar);
        setSize(200, 100);
    }
    
    private void fechar(){
        dispose();
    }
}
pauloeduardo2906

Valeu cara, usei exatamente o seu segundo exemplo e foi direitinho, eu tava fazendo parecido, mas eu deletava o argumento do super na tela de mensagem pq eu não sabia o que passar como parâmetro na hora de criar o objeto, mas aí eu criei um objeto de JFrame generico e funcionou!!!

Ficou assim na tela que chama:

TelaSobre sobre=new TelaSobre(frame);
 sobre.setVisible(true);

A tela da mensagem:

public TelaSobre(Frame owner) {
		super(owner,"Sobre");
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(361, 225);
		this.setTitle("Sobre");
		this.setModal(true);
		this.setLocation(300,300);
		this.setContentPane(getJContentPane());
	 
	}
d34d_d3v1l

O JOptionPane faz isso se não me engano.

Criado 5 de agosto de 2012
Ultima resposta 5 de ago. de 2012
Respostas 3
Participantes 3