我的应用程序中有一个聊天组件,JTextArea
上面有一个。现在,如何为特定文本(如 student://xxxx)添加类似 ActionListener 的事件?
因此,当我单击该文本 (student://xxxx) 时,会发生一些事情。谢谢你。
我的应用程序中有一个聊天组件,JTextArea
上面有一个。现在,如何为特定文本(如 student://xxxx)添加类似 ActionListener 的事件?
因此,当我单击该文本 (student://xxxx) 时,会发生一些事情。谢谢你。
这里试试这个小程序,尝试点击student://开头,会弹出一个消息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 中的所有客户端。但我的问题在这里:当有人点击 student://id text 时,我想弹出一个窗口。
是的,看看您的评论,我的投票是让您不在 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);
}
}