Tratamento de Eventos - Java

Olá!

Estou com dificuldades no tratamento de eventos em Java.
Gostaria de adicionar os logs de eventos ao TextArea, com a data e hora em que ocorreram.
Comecei a implementar o evento de click do botão. Ele funciona, mas não sei como faço para jogar o log na área de texto.
Tem uma parte do código que deixei comentada, que seria utilizada para adicionar o log a todos os eventos, mas não está funcionando como esperado (não implementei todos os eventos ainda).

Os eventos que quero monitorar são:

  1. Botao: MouseListener - Implementar todos os métodos desta interface.
  2. Frame: MouseListener - Implementar todos os métodos desta interface.
  3. Campo 1 e 2:FocusListener - Implementar todos os métodos desta interface.
  4. Campo 1 e 2:KeyListener - Implementar o método keyTyped informando no log a tecla pressionada.

Seria para ser mais ou menos assim:

Segue o código que estou utilizando, se alguém puder ajudar, agradeço muito!

package meventos;

import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class MEventos extends JFrame {

    private JLabel jCampo1, jCampo2, jLog;
    private JTextField jtfCampo1, jtfCampo2;
    private TextArea taLog;
    private JButton jbBotao;

    public MEventos() {
        IniciarComponentes();
    }

    public void IniciarComponentes() {
        jbBotao = new JButton("Botão");
        jbBotao.setBounds(320, 270, 80, 30);
        jbBotao.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("Botao Foi Clicado");
            }
        });

        this.setSize(450, 350);
        this.setLayout(null);

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Tratamento de Eventos");

        jCampo1 = new JLabel("Campo 1");
        jCampo1.setBounds(10, 10, 50, 20);

        jtfCampo1 = new JTextField();
        jtfCampo1.setBounds(10, 30, 200, 20);

        jCampo2 = new JLabel("Campo 2");
        jCampo2.setBounds(225, 10, 50, 20);

        jtfCampo2 = new JTextField();
        jtfCampo2.setBounds(225, 30, 200, 20);

        jLog = new JLabel("Log de Eventos");
        jLog.setBounds(10, 80, 90, 20);

        taLog = new TextArea("", 10, 60, TextArea.SCROLLBARS_VERTICAL_ONLY);
        taLog.setBounds(10, 100, 400, 150);
        taLog.setEditable(true);

        this.add(jCampo1);
        this.add(jtfCampo1);
        this.add(jCampo2);
        this.add(jtfCampo2);
        this.add(jLog);
        this.add(taLog);
        this.add(jbBotao);

    }
  
    /**
 
 
 // Não funciona corretamente
    //Método que pode ser utilizado para adicionar ao log todos eventos

public void addEventos(String evento)

{

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); //pega hora

Date date = new Date();

taLog.setText( dateFormat.format(date)+" - "+evento+"\n"+ taLog.getText());

taLog.setCaretPosition(0); //posiciona na primeira linha

}

public void keyTyped(KeyEvent e)

{

addEventos("Tecla \""+e.getKeyChar()+"\" digitada no Campo 1");//pega a tecla pressionada no campo 1

}

 *
 * */


    public static void main(String[] args) {
        JFrame x = new MEventos();
        x.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        x.setVisible(true);
    }

}

Bom dia.

Crie uma variável global e insira um método que vai concatenando as strings como a seguir em cada listener.

btnBotao.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent arg0) {
		texto += tempo.now().format(formatter) + " - Mouse clicado no Botão\n";
		taAreaTexto.setText(texto);
}

Conseguiu?

Ei

Consegui, valeu, muito obrigada.
Mas tenho outra dúvida. Como faço para manter todos os logs no TextArea? Porque o log está sempre aparecendo na primeira linha.
Por exemplo, se clico no botão, aparece: o botão foi clicado. Daí se passo o mouse pelo campo 1, aparece: mouse entrou no campo 1. Mas aí a linha anterior é apagada e substituída pelo novo log.
O setCaretPosition posiciona na primeira linha. Existe algum método para posicionar na próxima linha em branco ou ago do tipo?

A questão não é posicionar a linha abaixo.
Você tem que concatenar as strings.

Copia o código abaixo e rode:

private JPanel contentPane;
private JTextField txtCampo1;
private JTextField txtCampo2;
private LocalTime tempo;
protected DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_TIME;
private static String texto = "";

/**
 * Launch the application.
 */
public static void main(String[] args) {
	EventQueue.invokeLater(new Runnable() {
		@Override
		public void run() {
			try {
				Teste frame = new Teste();
				frame.setVisible(true);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	});
}

/**
 * Create the frame.
 */
public Teste() {
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	setBounds(100, 100, 450, 300);
	contentPane = new JPanel();
	contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
	setContentPane(contentPane);
	contentPane.setLayout(null);

	JPanel panel = new JPanel();
	panel.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null));
	panel.setBounds(10, 11, 414, 239);
	contentPane.add(panel);
	panel.setLayout(null);

	JLabel lblCampo = new JLabel("Campo1");
	lblCampo.setBounds(10, 11, 46, 14);
	panel.add(lblCampo);

	JLabel lblCampo_1 = new JLabel("Campo2");
	lblCampo_1.setBounds(214, 11, 46, 14);
	panel.add(lblCampo_1);

	txtCampo1 = new JTextField();
	txtCampo1.setBounds(10, 29, 165, 20);
	panel.add(txtCampo1);
	txtCampo1.setColumns(10);

	txtCampo2 = new JTextField();
	txtCampo2.setBounds(214, 29, 190, 20);
	panel.add(txtCampo2);
	txtCampo2.setColumns(10);

	JScrollPane scrollPane = new JScrollPane();
	scrollPane.setBounds(10, 99, 394, 97);
	panel.add(scrollPane);

	JTextArea taAreaTexto = new JTextArea();
	scrollPane.setViewportView(taAreaTexto);
	taAreaTexto.setBackground(Color.LIGHT_GRAY);
	taAreaTexto.setTabSize(50);

	JLabel lblLog = new JLabel("Log");
	lblLog.setBounds(10, 73, 46, 14);
	panel.add(lblLog);

	JButton btnBotao = new JButton("Botao");
	btnBotao.addMouseListener(new MouseAdapter() {
		@Override
		public void mouseClicked(MouseEvent arg0) {

		}
	});
	btnBotao.addActionListener(new ActionListener() {
		@Override
		public void actionPerformed(ActionEvent arg0) {
			texto += LocalTime.now().format(formatter) + " - Mouse clicado no Botão\n";
			taAreaTexto.setText(texto);
		}
	});
	btnBotao.setBounds(315, 205, 89, 23);
	panel.add(btnBotao);
    }
}
1 curtida

Entendi agora. Deu certo.
Muito obrigada mesmo!
Abraço

Por nada.
Marque o tópico como resolvido na minha resposta e dê um like se gostou…

1 curtida