2012-05-05 37 views
5

Tôi có trong ứng dụng của mình một thành phần trò chuyện có một số JTextArea trên đó. Bây giờ, làm cách nào để thêm một sự kiện giống như ActionListener cho một văn bản cụ thể (như sinh viên: // xxxx)?ActionListener cho một văn bản cụ thể bên trong một JTextArea?

Vì vậy, khi tôi nhấp vào văn bản đó (sinh viên: // xxxx), điều gì đó sẽ xảy ra. Cảm ơn bạn.

Trả lời

10

đây thử chương trình nhỏ này, hãy thử bấm vào đầu học sinh: //, mà sẽ bật lên một thông điệp 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(); 
      } 
     }); 
    } 
} 
+0

@ user1266039: Hãy thử chương trình nhỏ này, chỉ cần nhấp vào trước khi sinh viên: // và một thông báo sẽ bật lên :-) –

+0

cảm ơn bạn, trông rất đẹp. tôi sẽ thử nó. –

+0

hehe, Bạn CHÀO MỪNG QUÝ KHÁCH VÀ GIỮ NHỎ :-) –

2

Không, thậm chí không xem xét điều này vì ActionListeners là cho JButtons hoặc bất cứ điều gì khác có nguồn gốc từ AbstractButton nhưng không cho JTextComponents (ngoại trừ JTextFields). Có lẽ bạn muốn có một MouseListener. Có nói điều này, có lẽ bạn sẽ được tốt hơn với hai thành phần văn bản, một JTextArea để hiển thị tất cả các phản ứng, bao gồm cả người dùng, và ngay dưới đây trong một loại BorderLayout.SOUTH vị trí, một JTextField để cho phép người dùng để nhập văn bản vào cuộc trò chuyện. Sau đó, cho rằng JTextField một ActionListener (điều này là hợp pháp) để "nhập" sẽ kích hoạt người nghe.

Sửa 1
Bạn trạng:

Vâng, tôi đã JTextField rằng, các văn bản trong đó đã được gửi đến máy chủ và máy chủ sẽ gửi thông điệp tới tất cả khách hàng xuất hiện trong JTextArea. Nhưng vấn đề của tôi là ở đây: Tôi muốn bật lên một cửa sổ khi ai đó nhấp vào một sinh viên: // văn bản id.

Vâng, nhìn nhận xét của bạn, phiếu bầu của tôi là để bạn có thể hiển thị các cuộc trò chuyện không có trong JTextArea mà là trong một JList, một với một SelectionListener. Sau đó, bạn có thể trả lời dễ dàng các sự kiện nhấp chuột và sẽ dễ dàng nhận được thông tin hữu ích từ "dòng" được nhấp vào (nếu bạn điền vào JList với các đối tượng thông minh). Bạn sẽ cần phải viết một trình kết xuất ô tùy chỉnh cho phép nhiều dòng văn bản được hiển thị, có thể là một dòng hiển thị một JTextArea, nhưng hướng dẫn trên JLists sẽ giúp bạn bắt đầu về điều này.

+0

Có bạn mouselistener đúng có thể làm việc nhưng làm thế nào tôi có thể thực hiện một hành động với nó khi tôi nhấp vào một văn bản trông giống như sinh viên: // id? –

+0

@ user1266039: tại sao bạn lại muốn hành vi này? Mục tiêu tổng thể của điều này là gì? Tôi không nói rằng những gì bạn yêu cầu không thể được thực hiện, nhưng nó sẽ đòi hỏi một chút công việc, và hành vi có vẻ hơi buồn cười vì hầu hết các ứng dụng trò chuyện mà tôi quen thuộc không có chức năng này. –

+1

Tôi mạnh mẽ nghi ngờ OP muốn trò chuyện giống như siêu liên kết :-) – COD3BOY

1

Đang nhấn ENTER thay vì nhấp chuột phải không?

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); 
    } 
} 
Các vấn đề liên quan