2012-05-05 10 views
5

私は自分のアプリにJTextAreaのチャットコンポーネントを持っています。 特定のテキスト(student:// xxxxなど)に対してActionListenerのようなイベントを追加するにはどうすればよいですか?JTextArea内の特定のテキストのActionListener?

そのテキスト(student:// xxxx)をクリックすると、何かが起こります。 ありがとうございます。

答えて

10

学生の開始時にクリックしてください、この小さなプログラムを試してみてください://、メッセージダイアログがポップアップ表示されますその

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

@ user1266039:この小さなプログラムを試してみてください。student://の前にクリックしてください。メッセージはポップアップ:-) –

+0

ありがとうございます。私はそれを試してみます。 –

+0

hehe、あなたは大歓迎です。 –

2

ActionListenersはJButtonやAbstractButtonから派生したものですが、JTextComponents(JTextFieldsを除く)のものではないので、これは考慮しないでください。おそらく、あなたはMouseListenerが必要です。

これは、2つのテキストコンポーネント、つまりユーザーを含むすべての応答を表示するJTextAreaと、BorderLayout.SOUTHタイプの位置、JTextFieldでユーザーを許可するチャットにテキストを入力します。その後、JTextFieldにActionListener(これは正当なものです)を与え、 "enter"がリスナーを起動するようにします。

編集1
あなたの状態:

まあ、私は、その中のテキストは、サーバーと、サーバーに送信されているのJTextFieldがJTextAreaのに表示されているすべてのクライアントにメッセージを送信することがあります。しかし、私の問題はここにあります:誰かがstudent:// idテキストをクリックしたときにウィンドウをポップアップしたいと思います。

JTextAreaではなく、SelectionListenerでJTextAreaではなく、JListでチャットを表示することができます。マウスクリックイベントに簡単に反応でき、クリックした "ライン"から有益な情報を簡単に得ることができます(JListにスマートオブジェクトを埋め込む場合)。 JTextAreaを表示するカスタムセルレンダラーを記述する必要がありますが、JListsのチュートリアルではこれを開始することができます。

+0

はい、あなたは右のMouseListenerはうまくいくかもしれないですが、私はどのように実行することができますstudent:// idのようなテキストをクリックしたときの動作? –

+0

@ user1266039:なぜこの動作が必要ですか?これの全体的な目標は何ですか?私は、あなたが要求するものは実行できないと言っているわけではありませんが、ちょっとした作業が必要です。私がよく知っているほとんどのチャットアプリケーションはこの機能を持っていないので、このビヘイビアは面白く聞こえません。 –

+1

OPがチャットをハイパーリンクのようにしたいと強く思っています:-) – COD3BOY

1

マウスを右クリックするのではなく、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); 
    } 
}