Acessando componentes dentro de um listener

3 respostas
L

Hey galera, sou iniciante em Java e um problema aqui está acabando com meu ânimo de programar em Java:

Na classe main tenho um JFrame com um JTextField e um botão. Quando clico no botão quero imprimir o que está escrito no JTextField, porém, não estou conseguindo acessá-lo dentro do evento mouseClicked.

Eis o código:
http://codepad.org/o45nAmm4

Como comentei, o “problema” está na linha 56. Já tentei fazer get e set, mudar variáveis de lugar, criar outras classes, mas nada dá certo.

Alguém pode me dar uma força? Desde já agradeço a ajuda.
Abraços.

3 Respostas

Andre_Brito

Oi.

Não consegui acessar seu código. Poderia postar aqui no GUJ com as tags code?

Pra isso, não seria necessário somente usar um actionPerformed no botão e escrever o conteúdo do JTextField dentro desse método? Algo do tipo

private void meuBotaoActionPerformed(ActionEvent actionEvent) {
    System.out.println("Conteudo do JTextField: " + meuTextField.getText());
}
L

Mas como posso indicar ao compilador que esta ação refere-se ao clique do botão?

Aqui vai o código:

import java.awt.GridLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

public class Principal implements MouseListener {

	public static void main(String[] args) {
		
		JFrame frame = new JFrame();
		frame.setBounds(300, 300, 300, 180);
		frame.setTitle("Tela de login");
				
		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(6, 1));
		panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
		frame.add(panel);
		
		JLabel lbl_login = new JLabel();
		lbl_login.setText("Login");
		
		JTextField txt_login = new JTextField();
		
		JLabel lbl_senha = new JLabel();
		lbl_senha.setText("Senha");
		
		JTextField txt_senha = new JTextField();
		
		JButton btn_ok = new JButton();
		btn_ok.setText("Ok");
		Principal b = new Principal();
		btn_ok.addMouseListener(b);
		
		panel.add(lbl_login);
		panel.add(txt_login);
		panel.add(lbl_senha);
		panel.add(txt_senha);
		panel.add(new JLabel());
		panel.add(btn_ok);
		
		
		frame.setVisible(true);
		
		
	}

	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		String[] data = {"Arara", "Laranja", "Teto", "Amarelo", "Flor"};
		JList lst_senhas = new JList(data);
		
		
		for (int i = 0; i < 5; i++) {
			if( //PRECISO ACESSAR O JTEXTFIELD AQUI
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
}
Andre_Brito

Na verdade, nesse seu caso acho que não teria como, porque você cria uma nova classe pra lidar com os eventos do Mouse e não vai conseguir ‘ver’ o JTextField. O que você poderia fazer é delegar pra outra classe que vai lidar no JTextField (frame -> button -> mouseListener -> thatFrameManager -> frame’sTextField). Não sei até que ponto é legal de fazer isso… Acho que pode diminuir um pouco o acoplamento, mas aumenta a complexidade. Mas acredito que pode funcionar.

Mas assim… Se vai ficar tudo na mesma tela, uma alternativa é você colocar junto, na mesma classe, o mouseListener. Quem sabe de retorno de um método, se você deixar o JTextField como variável de instância. Algo como

myButton.addMouseListener(getMyMouseListener());

//... 

private MouseListener getMyMouseListener() {
    new MouseListener() {
        //...
    }
}

De qualquer forma, não sei se é o melhor jeito de resolver isso. O interessante seria ver alguem que entende bastante de Swing pra dar a direção correta.

Criado 26 de outubro de 2010
Ultima resposta 26 de out. de 2010
Respostas 3
Participantes 2