ActionListener para un texto específico dentro de un JTextArea?

Tengo en mi aplicación un componente de chat que tiene un JTextArea en él. Ahora, ¿cómo puedo agregar un evento similar a ActionListener para un texto específico (como student: // xxxx)?

Entonces, cuando hago clic en ese texto (student: // xxxx), algo sucederá. Gracias.

Aquí prueba este pequeño progtwig, intenta hacer clic al inicio del alumno: //, que aparecerá un diálogo

 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class TextAreaExample extends JFrame { private JTextArea tarea = new JTextArea(10, 10); private JTextField tfield = new JTextField(10); private void createAndDisplayGUI() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); tarea.setText("Hello there\n"); tarea.append("Hello student://"); JScrollPane scroll = new JScrollPane(tarea); tfield.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { tarea.append(tfield.getText() + "\n"); } }); tarea.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent me) { int x = me.getX(); int y = me.getY(); System.out.println("X : " + x); System.out.println("Y : " + y); int startOffset = tarea.viewToModel(new Point(x, y)); System.out.println("Start Offset : " + startOffset); String text = tarea.getText(); int searchLocation = text.indexOf("student://", startOffset); System.out.println("Search Location : " + searchLocation); if (searchLocation == startOffset) JOptionPane.showMessageDialog(TextAreaExample.this, "BINGO you found me."); } }); getContentPane().add(scroll, BorderLayout.CENTER); getContentPane().add(tfield, BorderLayout.PAGE_END); pack(); setLocationByPlatform(true); setVisible(true); } public static void main(String... args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new TextAreaExample().createAndDisplayGUI(); } }); } } 

No, ni siquiera consideres esto porque los ActionListeners son para JButtons o cualquier otra cosa derivada de AbstractButton pero no para JTextComponents (excepto para JTextFields). Tal vez quieras un MouseListener.

Habiendo dicho esto, tal vez será mejor con dos componentes de texto, un JTextArea para mostrar todas las respuestas, incluida la del usuario, y justo debajo de esta en un tipo de posición BorderLayout.SOUTH, un JTextField para permitir al usuario ingresar texto en el chat. Luego, dale a JTextField un ActionListener (esto es legal) para que “enter” active al oyente.

Editar 1
Usted dice:

Bueno, tengo ese jtextfield, el texto está siendo enviado al servidor y el servidor envía el mensaje a todos los clientes que aparecen en JTextArea. Pero mi problema está aquí: quiero abrir una ventana emergente cuando alguien hace clic en un alumno: // id text.

Sí, mirando tus comentarios, mi voto es para que muestres los chats no en un JTextArea, sino en un JList, uno con un SelectionListener. Luego puede responder fácilmente a los eventos de clic del mouse y obtendrá más fácilmente información útil de la “línea” en la que se hizo clic (si llena la Lista J con objetos inteligentes). Tendrá que escribir un procesador de celdas personalizado que permita que se muestren varias líneas de texto, probablemente una que muestre un JTextArea, pero el tutorial de JLists lo ayudará a comenzar con esto.

Está presionando ENTER en lugar de hacer clic con el botón del mouse, ¿está bien?

 import javax.swing.*; import java.awt.*; import java.awt.event.*; public class StudentID extends JFrame implements ActionListener { private static final String progname = "StudentID 0.1"; private JTextField student; private JTextArea feedback; private JButton exit; public StudentID () { super (progname); JPanel mainpanel = new JPanel (); mainpanel.setLayout (new BorderLayout ()); this.getContentPane ().add (mainpanel); student = new JTextField ("student://"); exit = new JButton ("exit"); student.addActionListener (this); exit.addActionListener (this); feedback = new JTextArea (); mainpanel.add (student, BorderLayout.NORTH); mainpanel.add (feedback, BorderLayout.CENTER); mainpanel.add (exit, BorderLayout.SOUTH); setSize (400, 400); setLocation (100, 100); setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setVisible (true); } public void actionPerformed (final ActionEvent e) { SwingWorker worker = new SwingWorker () { protected String doInBackground () throws InterruptedException { String cmd = e.getActionCommand (); if (cmd.equals ("exit")) { System.exit (0); } else if (cmd.matches ("student://[0-9]+")) { feedback.setText ("student found: " + cmd.replaceAll ("student://([0-9]+)", "$1")); } else { feedback.setText ("cmd: " + cmd); } return "done"; } protected void done () { feedback.setText (feedback.getText () + "\ndone"); } }; worker.execute (); } public static void main (final String args[]) { Runnable runner = new Runnable () { public void run () { new StudentID (); } }; EventQueue.invokeLater (runner); } }