Janelas Modais

15 respostas
F

Como faço para criar uma Janela Modal no Java?

Sei que posso utilizar o JDialog usando o metodo setModal(true) mas ocorre num problema, o JDialog habilita apenas o botão de fechar (X) e some com o minimizar e maximizar…

Qual a soloção para isso?
Como utilizar Janelas modais em um JFrame?

Agradeço,
Fábio.

15 Respostas

F

“fabio.candia”:
Como faço para criar uma Janela Modal no Java?

Sei que posso utilizar o JDialog usando o metodo setModal(true) mas ocorre num problema, o JDialog habilita apenas o botão de fechar (X) e some com o minimizar e maximizar…

Qual a soloção para isso?
Como utilizar Janelas modais em um JFrame?

Agradeço,
Fábio.

Se eu não me engano o JFrame também possui o método setModal, dessa forma seria só vc usar assim:

vc já tentou isso ??

[]s,

Fabrício.
F

O JFrame não possui o método setModal(boolean b) não!!!

[]s…
Fábio.

brlima

Dá uma olhada nesse topico da sun.
Parece que vc pode criar um Panel modal, ou seja, escutando todos os eventos de janela…
Talvez te ajude:

Modal Frame or Dialog with Minimize/Maximize buttons

F

Valeu,

Isso resolveu, o Frame não ficou modal, mas quem o disparou fica ouvindo e qdo ele perde o foco é forçado a ser apresentado novamente!

Achei o efeito estranho, mas resolve…

[]s…
Fábio.

dsiviotti

Substitua JFrame por JDialog. JDialog tem setModal(true).

F

Douglas,

JDialog tem setModal(boolean b) sim, mas como eu disse na primeira mensagem se usar o JDialog os botões de maximizar / minimizar não aparecem… o JDialog não habilita esses botões… dessa forma não é interessante utiliza-lo…

A forma encontrada enviada em respostas anteriores funciona, mas causa um efeito estranho, pois o JFrame perde o foco e depois é jogado pra frente novamente…

Se alguém souber alguma outra solução…

Abraços,
Fábio.

L

ei brlima,

Peguei aquele exemplo fiz um teste mas nao deu certo .  Fiz o seguinte :

criei um JFrame chamado principal com a penas um botao. E coloquei o seguinte codigo no botao :

modal test = new modal();   //  modal eh um JFrame

YourModalFrame jmodal = new YourModalFrame(test);

jmodal.show();

Nao vi nenhum tipo de efeito !!

valeu

F

O efeito é que quando vc clica no JFrame q disparou o JFrameModal ele pisca a tela do JFrameModal… pq aquele código cria um Listener q fica verificando qdo o JFrameModal perde o foco e assim envia ele pra frente novamente!!!

Fábio.

L

“fabio.candia”:
O efeito é que quando vc clica no JFrame q disparou o JFrameModal ele pisca a tela do JFrameModal… pq aquele código cria um Listener q fica verificando qdo o JFrameModal perde o foco e assim envia ele pra frente novamente!!!

Fábio.

Eu sei , eu quero saber eh pq da forma que eu coloquei (ver codigo acima) nao ta  dando certo !!

Rapaz aproveitando, tira uma duvida. Observei que no construtor da classe YourModalFrame tem o seguinte codigo :

public YourModalFrame(JFrame owner){

super(Modal Frame);

this.owner = owner;  ///essa aqui eh minha duvida. Isso ta certo ?



}
F

Não entendi seu exemplo:
“modal” é uma herança de JFrame? Vc. implementa algo nele?
YourModalFrame? Quem é essa classe? Um JFrame qualquer?

Pq vc passa o “test” (que é um modal) para o construtor do YourModalFrame? Já que vc está trabalhando sobre o Principal?

Se vc. puder mandar o codigo fonte completo do seu exemplo eu agradeço.

[]s…
Fábio.

L

O modal eh um JFrame. YourModalFrame eh a classe que o brlima passou no exemplo(aquela que tem o Listener).

Eu to na principal (no botao que tem nessa classe), a partir de dela eu crio um modal, passo entao esse modal para o construtor da classe YourModalFrame. E depois mando mostrar. Da uma olhada no codigo:

Essa aqui eh a classe YourModalFrame

Aqui eh a principal :

Aqui eh a modal (que ainda nao eh modal, mas vai ser !!)

F

no seu exemplo aonde vc colocar o código:
YourModalFrame jmodal = new YourModalFrame(test);

vc deveria usar

modal test = new modal(this);

test.show();

OBS: modal deveria herdar do YourModalFrame e o “this” está referenciando ao proprio Principal… vc vai criar um novo JFrame (modal) onde o owner é o Principal!!!

qto a sua questão anterior que vc pergunta se está correto:
this.owner = owner;
está correto sim, dessa forma vc está configurando sua variavel private owner da classe com o parametro owner passado para o construtor.

L

“Fábio R. Candiá”:
no seu exemplo aonde vc colocar o código:
YourModalFrame jmodal = new YourModalFrame(test);

vc deveria usar

modal test = new modal(this);

test.show();

OBS: modal deveria herdar do YourModalFrame e o “this” está referenciando ao proprio Principal… vc vai criar um novo JFrame (modal) onde o owner é o Principal!!!

qto a sua questão anterior que vc pergunta se está correto:
this.owner = owner;
está correto sim, dessa forma vc está configurando sua variavel private owner da classe com o parametro owner passado para o construtor.

Eu ja tentei isso, mas nao deu certo. Na classe YourModalFrame eu tenho que declara owner do tipo JFrame ??

F

owner é do tipo JFrame sim!!!

segue abaixo um exemplo que eu fiz qdo testei isso!!!
é mais simples que o seu mas dá pra vc ver o funcionamento!!!

import java.awt.Cursor;

import java.awt.event.KeyAdapter;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseMotionAdapter;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

/*

  • Created on 01/06/2004

  • TODO To change the template for this generated file go to

  • Window - Preferences - Java - Code Generation - Code and Comments
    /
    /
    *

  • @author Fábio R. Candiá

  • TODO To change the template for this generated type comment go to

  • Window - Preferences - Java - Code Generation - Code and Comments
    
    */
    
    public class Testando extends JFrame implements WindowListener {
    
    private JFrame owner;
    
    public static void main(String[] args) {
    
    JFrame y = new JFrame(Frame 1);
    
    y.setSize(400, 300);
    
    y.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
     y.show();
     
     Testando x = new Testando(y);
     x.setSize(200, 150);
     
     x.show();
    

    }

    public Testando(JFrame owner) {
    super(“Modal Frame”);

    this.owner = owner;     
     // we put a glass panel into the main frame    
     JPanel glassPanel = new JPanel();    
     glassPanel.setOpaque(false);    
     glassPanel.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));    
     // blocking the events!!!    
     glassPanel.addKeyListener        (new KeyAdapter()        {});    
     glassPanel.addMouseListener      (new MouseAdapter()      {});    
     glassPanel.addMouseMotionListener(new MouseMotionAdapter(){});    
     owner.setGlassPane(glassPanel);    
     // the frame will listener owner windows events    
     owner.addWindowListener(this);
    

    }

    public void windowOpened(WindowEvent e){}

    public void windowClosing(WindowEvent e){}

    public void windowClosed(WindowEvent e){}

    public void windowIconified(WindowEvent e) {
    
    // Do you want this too?
    
    <a href="//super.setState">//super.setState</a>(JFrame.ICONIFIED);
    
    }
    
    public void windowDeiconified(WindowEvent e) {
    
    if(super.getState() == JFrame.ICONIFIED)
    
    super.setState(JFrame.NORMAL);
    
    this.requestFocus();
    
    }
    
    public void windowActivated(WindowEvent e) {
    
    this.requestFocus();
    
    }
    

    public void windowDeactivated(WindowEvent e) {}
    }

L

Eu copiei e colei esse exemplo ai q vc deu, mas nao deu certo !!, acho q deve ser alguma especie de macumba ou algo do genero !!! Mas de qq forma, valeu pela atencao !!

Ate mais !!

Criado 31 de maio de 2004
Ultima resposta 11 de jun. de 2004
Respostas 15
Participantes 5