Ajuda com JButton + KeyListener [RESOLVIDO]

16 respostas
brunorota

Olá galera

Eu preciso do seguinte e nao encontrei uma solução

Eu preciso que ao apertar a tecla ENTER a aplicação executara o JButton do frame mesmo ele nao estando em foco.

Quem puder ajudar ^^

Atenciosamente

16 Respostas

D

Acho que você quer o seguinte. Usuário digita um texto no JTextField e dá um enter. Quando ele pressionar o enter ele faz a mesma ação do JButton. É isso? Se for basta adicionar o KeyListener ao JTextField ou no componente em questão.

brunorota

Opa Daniels

Deu certinho

Era uma tela com login, com user e password, eu adicionei o KeyListener neles e deu certo ^^

Eu tava adicionando o KeyListener no JButton =X por isso nao tava dando certo hehehe

Obrigado =)

diegofreire

O próprio ActionListener poderia fazer isso pra você, tão utilizado nos JButtons da vida…

fica ai a dica,

Diego.

ViniGodoy

E se ele tivesse uns 20 componentes, com textfields, comboboxes, lists, etc?
Tem maneiras mais fáceis e melhores de fazer isso.

a) Se você quer acionar um só um botão padrão, no construtor do seu JFrame faça:
getRootPane().setDefaultButton(seuBotaoPadrao);

A vantagem é que o botão será desenhado com uma borda mais forte, indicando que ele é o padrão. O padrão é acionado sempre que o usuário pressiona enter. No seu caso, é a abordagem mais indicada.

b) Se são uma série de botões, como no caso dos números de uma calculadora, use o InputMap e o ActionMap:
http://www.guj.com.br/posts/list/140986.java

A vantagem desses métodos é que, caso você precise colocar mais um JTextField na tela, você não precisará lembrar-se de adicionar um listener nele. É especialmente prático caso você tenha vários botões (como no caso da calculadora), ou vários campos, como num formulário. Eles também funcionam caso nenhum JTextField tenha o foco.

Eu recomendo fortemente que você apague esses keylisteners e defina o botão como padrão. O código fica mais limpo e o desenho do form mais consistente.

brunorota

viny eu tentei fazer o seu método só que não deu certo

Olha do jeito q eu fiz
public void initialize(){
		this.setSize(350,230);
		this.setContentPane(getContainer());
		getRootPane().setDefaultButton(btn);
		this.setVisible(true);
		this.setTitle("Login");
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setModal(false);
	}

O que eu tenho que fazer?

ViniGodoy

O que não deu certo? Deu erro? Não fez nada? O que houve?

ViniGodoy

Você tem certeza que a variável btn não está nula nesse momento?

brunorota

Tipo ela não esta nula não

Acontece o seguinte, quando eu pressiono o ENTER, o JButton até é pressionado, mais o evento que tem nele não é executado

ViniGodoy

Põe seu código todo aí. Se for muito longo, põe nos attachments.

brunorota
package gui;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;

import business.Login;



import database.LoginDB;

public class LoginGUI extends JDialog implements MouseListener{

	private static final long serialVersionUID = 1L;
	private JPanel container = null;
	private JPanel panelLogin = null;
	private JButton btn = null;
	private JLabel lUsuario = null;
	private JLabel lSenha = null;
	private JTextField txtUsuario = null;
	private JPasswordField txtSenha = null;
	
	LoginGUI(){
		super();
		initialize();
	}
	
	public void initialize(){
		this.setSize(350,230);
		this.setContentPane(getContainer());
		getRootPane().setDefaultButton(btn);
		this.setVisible(true);
		this.setTitle("Login");
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setModal(false);
	}
	
	public JPanel getContainer(){
		
		if(container == null){
			
			container = new JPanel();
			container.setLayout(null);
			
			container.add(getPanelLogin());
		}
		
		return container;
	}
	
	public JPanel getPanelLogin(){
		
		if(panelLogin == null){
			
			TitledBorder t = new TitledBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Login"));
			
			panelLogin = new JPanel();
			panelLogin.setLayout(null);
			panelLogin.setBounds(10, 10, 320, 180);
			panelLogin.setBorder(t);
			panelLogin.setVisible(true);
			
			lUsuario = new JLabel();
			lUsuario.setBounds(30, 50, 50, 29);
			lUsuario.setText("Admin");
			panelLogin.add(lUsuario);
			
			lSenha = new JLabel();
			lSenha.setBounds(30, 90, 50, 29);
			lSenha.setText("Senha");
			panelLogin.add(lSenha);
			
			txtUsuario = new JTextField();
			txtUsuario.setBounds(110, 41, 170, 30);
			panelLogin.add(txtUsuario);
			
			txtSenha = new JPasswordField();
			txtSenha.setBounds(110, 80, 170, 31);
			panelLogin.add(txtSenha);
			
			btn = new JButton();
			btn.setBounds(110, 130, 94, 20);
			btn.setText("Entrar");
			btn.addMouseListener(this);
			panelLogin.add(btn);
			
		}
		return panelLogin;
	}
	
	public static void main(String args[]){
		
		LoginGUI l = new LoginGUI();
	}

	public void mouseClicked(MouseEvent e) {
		
		if(e.getSource() == btn){
			
			Login l = new Login();
			l.setUser(txtUsuario.getText());
			l.setSenha(txtSenha.getText());

			if(new LoginDB().validarLogin(l) != 0){
				
				try {
				
					this.dispose();
					MenuPrincipal m;
					m = new MenuPrincipal(l.getUser(), l.getUser(), l.getSenha());
					m.setExtendedState(JFrame.MAXIMIZED_BOTH);
					m.setVisible(true);
					
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				
			}
			else
			{
				JOptionPane.showMessageDialog(null,
						"Usuário ou senha inválidos. Favor digitar um usuário e uma senha correta", "Aviso", JOptionPane.WARNING_MESSAGE);
			}
			
		}
		
	}

	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

}

ta ae =)

ViniGodoy

Cara, vc tem que adicionar um ActionListener no seu JButton, não um MouseListener.

Faz assim, tira fora o “implements MouseListener” do seu JFrame.

E daí, no lugar de:
btn.addMouseListener(this);

Faça:

btn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { efetuarLogin(); } });

E daí deixa o método efetuarLogin assim:

public void efetuarLogin() {
    Login l = new Login();  
    l.setUser(txtUsuario.getText());  
    l.setSenha(txtSenha.getText());  

    if(new LoginDB().validarLogin(l) == 0){  
        JOptionPane.showMessageDialog(null,  
            "Usuário ou senha inválidos. Favor digitar um usuário e uma senha correta", "Aviso", JOptionPane.WARNING_MESSAGE);  
        return;
    }

    try {  
        this.dispose();  
        MenuPrincipal m = new MenuPrincipal(l.getUser(), l.getUser(), l.getSenha());  
        m.setExtendedState(JFrame.MAXIMIZED_BOTH);  
        m.setVisible(true);  
    } catch (IOException e1) {  
        throw new RuntimeException(e1.getMessage(), e1);
    }  
}
brunorota

Deu certo Vini

Obrigado

Vou pedir uma dica, eu estou trabalhando sempre com MouseListener, qual é melhor o MouseListener ou o ActionListener?

D

E se ele tivesse uns 20 componentes, com textfields, comboboxes, lists, etc?
Tem maneiras mais fáceis e melhores de fazer isso.

Concordo, mas pela dúvida deduzi que seria apenas um JTextField, então indiquei a solução mais simples.

ViniGodoy

Tipicamente, implementa-se botões com o ActionListener.

A “action” é a ação que um componente deveria fazer ao ser “ativado”. A ativação do botão pode ser via mouse ou teclado, no pressionamento de uma tecla de hint, por exemplo.

O “mouse” listener trata apenas de eventos do mouse. Por isso, o enter disparou a ação do botão, mas não o mouse listener, já que enter é uma tecla de teclado.

brunorota

HUmm

Entendi vini

Obrigado pela aula =)

Atenciosamente

ViniGodoy

De nada, foram 2 problemas resolvidos pelo preço de 1.

Além do MouseListener, há também o KeyListener, para quando você só quiser ouvir eventos de teclado.

Criado 8 de fevereiro de 2010
Ultima resposta 8 de fev. de 2010
Respostas 16
Participantes 4