Hide não funciona

4 respostas
Ironlynx
Tô codando em quantidade e a qualidade vai para o saco... nessa classe simples:
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();}            });
        
    }	
  }
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! :D

4 Respostas

Rafael_Steil

Usa setVisible(false);

Rafael

dsiviotti

“Rafael Steil”:
Usa setVisible(false);

Rafael

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í.

TedLoprao

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!

Ironlynx

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
 meio cansado jah  faiando feiohuahuaha

 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? 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  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! <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/s.pnglight_smile.png?v=5" title=":slight_smile:" class="emoji" alt=":slight_smile:">
Criado 9 de agosto de 2004
Ultima resposta 10 de ago. de 2004
Respostas 4
Participantes 4