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();} });
}
}
Hide não funciona
4 Respostas
Usa setVisible(false);
Rafael
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í.
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! <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:">