ActionListener для конкретного текста внутри JTextArea?

В моем приложении есть компонент чата, на котором есть JTextArea . Теперь, как я могу добавить событие, подобное ActionListener, для определенного текста (например, student: // xxxx)?

Поэтому, когда я нажимаю на этот текст (student: // xxxx), что-то произойдет. Спасибо.

Здесь попробуйте эту небольшую программу, попробуйте нажать в начале студент: //, появится сообщение Dialog

 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(); } }); } } 

Нет, даже не рассматривайте это, поскольку ActionListeners предназначены для JButtons или чего-либо еще, полученного из AbstractButton, но не для JTextComponents (кроме JTextFields). Возможно, вам нужен MouseListener.

Сказав это, возможно, вам будет лучше с двумя текстовыми компонентами, JTextArea для отображения всех ответов, включая пользователя, и прямо под этим в позиции BorderLayout.SOUTH, JTextField, чтобы позволить пользователю вводить текст в чат. Затем дайте JTextField ActionListener (это законно), чтобы «enter» активировал слушателя.

Редактировать 1
Вы заявляете:

Ну, у меня есть это jtextfield, текст в нем отправляется на сервер, и сервер отправляет сообщение всем клиентам, которые появляются в JTextArea. Но моя проблема здесь: я хочу всплывать окно, когда кто-то нажимает на ученика: // id text.

Да, глядя на ваши комментарии, мой голос за то, что вы показываете чаты не в JTextArea, а скорее в JList, один с SelectionListener. Затем вы можете легко реагировать на события щелчка мыши и легче получить полезную информацию из нажатой кнопки «line» (если вы заполните JList интеллектуальными объектами). Вам нужно будет написать собственный визуализатор ячеек, который позволяет отображать несколько строк текста, возможно, тот, который показывает JTextArea, но учебник по JLists поможет вам начать с этого.

Нажимает ENTER вместо щелчка мыши ОК?

 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); } } 
  • Обработка кликов для всех элементов управления в форме
  • Мышь родительского контроля Ввод / выключение событий с помощью детского контроля
  • Что означает логическое значение, возвращаемое из метода обработки событий в Android
  • Должен ли я избегать обработчиков событий async void?
  • Неактивность и активность WPF
  • Пользовательские события в jQuery?
  • Как использовать GWT EventBus
  • Как я могу отменить регистрацию «анонимного» обработчика событий
  • Событие jquery live для добавления элементов dom
  • Суперпростой пример наблюдателя C # / наблюдаемого с делегатами
  • Загружается событие AngularJs для вызова после содержимого
  • Давайте будем гением компьютера.