5

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

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

4

3 に答える 3

10

ここで、この小さなプログラムを試してください。student:// の先頭をクリックすると、メッセージ ダイアログが表示されます。

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();
            }
        });
    }
}
于 2012-05-05T15:09:55.413 に答える
2

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

そうは言っても、おそらく2つのテキストコンポーネント、ユーザーを含むすべての応答を表示するJTextArea、およびBorderLayout.SOUTHタイプの位置のこのすぐ下、ユーザーがテキストを入力できるようにするJTextFieldを使用したほうがよいでしょう。チャット。次に、その JTextField に ActionListener (これは有効です) を与えて、"enter" でリスナーを起動できるようにします。

編集1
あなたは次のように述べています:

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

ええ、あなたのコメントを見て、チャットを JTextArea ではなく、SelectionListener を持つ JList に表示することに投票します。これにより、マウス クリック イベントに簡単に応答でき、クリックされた「行」から有用な情報をより簡単に取得できます (JList にスマート オブジェクトを入力した場合)。複数行のテキストを表示できるようにするカスタム セル レンダラー (おそらく JTextArea を表示するもの) を作成する必要がありますが、JLists のチュートリアルでこれを開始できます。

于 2012-05-05T14:25:46.590 に答える
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);
    }
}
于 2012-05-05T14:58:31.177 に答える