我在我的應用程序中有一個其上有JTextArea
的聊天組件。 現在,我該如何爲特定文本(如student:// xxxx)添加類似ActionListener的事件?ActionListener爲JTextArea內的特定文本?
所以,當我點擊的文本(學生:// xxxx)中會發生點什麼。 謝謝。
我在我的應用程序中有一個其上有JTextArea
的聊天組件。 現在,我該如何爲特定文本(如student:// xxxx)添加類似ActionListener的事件?ActionListener爲JTextArea內的特定文本?
所以,當我點擊的文本(學生:// xxxx)中會發生點什麼。 謝謝。
這裏試試這個小程序,嘗試點擊在學生開始://,會彈出一個消息框
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是Jbutton將或其他任何從AbstractButton中衍生而來,但不是JTextComponents(除JTextField的情況下)。也許你想要一個MouseListener。說到這一點,也許你會更好用兩個文本組件,一個JTextArea來顯示所有的響應,包括用戶的,並在右下方的BorderLayout.SOUTH類型的位置,一個JTextField允許用戶在聊天中輸入文字。然後給JTextField一個ActionListener(這是合法的),這樣「enter」將啓動監聽器。
編輯1
幽州:
嗯,我說的JTextField,它的文本被髮送到服務器,服務器將郵件發送到出現在JTextArea中的所有客戶端。但我的問題在這裏:我想在有人點擊學生時彈出一個窗口:// id text。
呀,看你的意見,我的票是你不是在一個JTextArea而是一個JList,一用一SelectionListener中顯示的聊天記錄。然後,您可以輕鬆響應鼠標點擊事件,並且可以更輕鬆地從點擊的「行」中獲取有用信息(如果您使用智能對象填充JList)。您需要編寫一個自定義的單元格渲染器,允許顯示多行文本,可能是顯示JTextArea的一行文本,但JLists教程將幫助您着手於此。
是的,你是正確的MouseListener可能的工作,但我怎麼能執行當我點擊一個看起來像student:// id的文本時,它會採取什麼行動? –
@ user1266039:你爲什麼想要這樣的行爲?這個的總體目標是什麼?我並不是說你所要求的內容不能完成,但需要一些工作,並且行爲聽起來有點有趣,因爲我熟悉的大多數聊天應用程序都沒有這個功能。 –
我強烈懷疑OP想聊天是像一個超鏈接:-) – COD3BOY
是敲回車代替鼠標點擊ok?
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);
}
}
@ user1266039:試試這個小程序,只需點擊學生之前://,並且會彈出一條消息:-) –
謝謝你,看起來很好。我會試試看。 –
hehe,你是最歡迎和保持微笑:-) –