ActionListener的JTextArea内的特定文本?
我在我的应用程序中有一个JTextArea
的聊天组件。 现在,我怎么能为特定的文本添加一个类似于ActionListener的事件(比如student:// xxxx)呢?
所以当我点击那个文本(student:// xxxx)时,会发生什么事情。 谢谢。
这里试试这个小程序,试着点击学生的开头://,会popup一个消息对话框
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.SOUTHtypes的位置,一个JTextField允许用户input文本到聊天。 然后给这个JTextField一个ActionListener(这是合法的),这样“enter”将启动监听器。
编辑1
你说:
那么我有这个jtextfield,其中的文本被发送到服务器和服务器发送消息到所有客户端出现在JTextArea。 但我的问题是在这里:我想要popup一个窗口,当有人点击一个学生:/ / ID文本。
是的,看着你的评论,我的投票是让你显示不是在JTextArea中的聊天,而是在一个JList中,一个与SelectionListener。 然后,您可以轻松地对鼠标点击事件作出响应,并且可以更轻松地从单击“行”中获取有用信息(如果使用智能对象填充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); } }