Hide não funciona

Tô codando em quantidade e a qualidade vai para o saco…
nessa classe simples:

[code]
import javax.swing.;
import javax.swing.border.
;
import java.awt.;
import java.awt.event.
;

public class Validar extends JDialog implements ActionListener{
JTextField txtUsuario;
JPasswordField txtSenha;
JButton entrar, cancelar;
String usuario = "adm", senha = "1234";
public static Validar janela;

public Validar(Frame owner, String title, boolean modal){
  super(owner, title, modal);
 
 }

public Container adicionarComponentes(){
 Container tela = getContentPane();
      
  BorderLayout layout = new BorderLayout();
  tela.setLayout(layout);

  JLabel lblUsuario = new JLabel("Nome do Usuário:");
  JLabel lblSenha = new JLabel("Senha:");
  txtUsuario = new JTextField(10);
  txtSenha = new JPasswordField(10);

  JPanel superior = new JPanel();
  superior.setLayout(new GridLayout(2, 2, 5, 5));
  superior.add(lblUsuario);
  superior.add(txtUsuario);
  superior.add(lblSenha);
  superior.add(txtSenha);
  
  JPanel superior2 = new JPanel();
  
  String titulo = "Informe o nome de usuário e Senha";
  Border etched = BorderFactory.createEtchedBorder();
  Border borda = BorderFactory.createTitledBorder(etched, titulo);
  
  superior2.setBorder(borda);
  superior2.setLayout(new FlowLayout(FlowLayout.LEFT));
  superior2.add(superior);

  entrar = new JButton("Entrar");
  entrar.addActionListener(this);
 
  cancelar = new JButton("Cancelar");
  cancelar.addActionListener(this);    
  
  JPanel inferior = new JPanel();
  inferior.setLayout(new FlowLayout(FlowLayout.RIGHT));
  inferior.add(entrar);
  inferior.add(cancelar);
  
  tela.add(BorderLayout.NORTH, superior2);
  tela.add(BorderLayout.SOUTH, inferior);
  
  return tela;	
}  	
  	
public void adicionarJDialog(){
 JDialog janela=new JDialog();
 janela.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 janela.setContentPane(this.adicionarComponentes());
 janela.getRootPane().setDefaultButton(entrar);
 janela.setSize(280, 150);
 janela.setLocationRelativeTo(null);        
 janela.setVisible(true);
  		
}

public void verificar(String u, String s){
if((u.equals(usuario)) && (s.equals(senha))){
  janela.hide();
  //permitirAcesso();
                                             }
else{
  JOptionPane.showMessageDialog(null, "Dados Incorretos.");
  txtUsuario.requestFocus();
    }
}

public void actionPerformed(ActionEvent e){
    String senha = new String(txtSenha.getPassword());
    
    if(e.getSource() == entrar){
      verificar(txtUsuario.getText(), senha);
    }
    else
      System.exit(0);  
}

public static void main(String []args){
 janela=new Validar(null, "Nome de Usuário de Senha", true);
	
 javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            janela.adicionarJDialog();}            });
    
}	

}[/code]
Não consigo fazer a M…do janela.hide() funcionar mesmo entrando com a
senha e o usuário corretos…(Dá um disconto q eu ainda não dormi…huahau)
Deve ser um “shit error” mas não tô conseguindo ver… :?
Se alguém enxergar GRITA! :smiley:

Usa setVisible(false);

Rafael

[quote=“Rafael Steil”]Usa setVisible(false);

Rafael[/quote]

Eu testei aqui e também não funciona. Tentei por janela.dispose() e também não funcionou. Só funciona System.exit(0), mas isso não serve se esta janela não deve fechar o programa.

Na verdade não conheço o código abaixo na sua classe:

javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                janela.adicionarJDialog();}            });
       
    }   

O que faz invokeLater()? Acho que é por aí.

Na verdade o problema está no seu código… Vc cria uma instancia de validar no main mas não executa o show da mesma (q é JDialog), a instancia vc joga em uma variável static janela… em seguida vc chama um método que cria um novo JDialog e o preenche e apresenta. Entretanto o seu botão vê a janela static e não a JDialog q vc criou no método adicionarJDialog(), ou seja, vc dá o hide de uma janela que já esta hide…
Vc precisa mudar seu código, ou vc apresenta a própria Validar, montando todo o layout nela ou cria a JDialog em uma variável de instância. De qualquer uma das formas vc deve retirar aquela variável static!!

Fallow e espero ter ajudado!

Ele cria uma thread segura(event dispatching thread) para sua aplicação!Sabe aquele atraso,aquela mardita tela cinza q dah vontade de chutar a máquina?Pois é… a Sun recomenda!Indispensáveis:
http://java.sun.com/docs/books/tutorial/uiswing/misc/threads.html
http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
e SwingWorker:
http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html
Cada um(event-dispatching threads,timers e swingworkers tem sua aplicação…boa leitura!)

                       É isso aí Loprão! :D

Tô meio cansado jah tô faiando feio…huahuaha…
Só para ser mais claro para quem não entendeu:eu criei uma variável de classe e a instanciei la no main(),mas no invokeLater() eu chamei adicionarJDialog();-reparem no construtor de Validar e a chamada a super()…sacaram?Há 2 JDialogs(como o Loprão falou)!o new() criou uma janela diferente da que está rodando no invokeLater()q é a q estará em execução…(Early Binding da minha var estática!).Logo não preciso criar variável de instância alguma era só dar um grito para a Heap q minha classe existe:
new Validar(null, “Nome de Usuário de Senha”, true);
no método run() do SwingUtilities.invokeLater();
Valeu Loprão! :slight_smile: