ActionListener для конкретного текста внутри JTextArea?
В моем приложении есть компонент чата, на котором есть JTextArea
. Теперь, как я могу добавить событие, подобное ActionListener, для определенного текста (например, student: // xxxx)?
Поэтому, когда я нажимаю на этот текст (student: // xxxx), что-то произойдет. Спасибо.
- jQuery одно и то же событие click для нескольких элементов
- .NET Events - Что такое отправитель объекта и EventArgs?
- Когда происходит событие «размытия», как я могу узнать, какой элемент фокуса пошел * на *?
- Проверка на нуль до отправки события ... streamобезопасная?
- Как события вызывают утечку памяти на C # и как облегчить работу слабых ссылок?
- Реализация сканера штрих-кода на Java
- Мне нужно событие для обнаружения подключения к Интернету / отключения
- Добавление и удаление анонимного обработчика событий
- Что такое параметр e (событие) и зачем передавать его функции JavaScript?
- Как я могу создать событие в usercontrol и поймать его на главной странице?
- Слабая модель обработчика событий для использования с lambdas
- Выделить событие с текстовым полем?
- Как обеспечить, чтобы событие было подписано только один раз
Здесь попробуйте эту небольшую программу, попробуйте нажать в начале студент: //, появится сообщение 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); } }