2012-05-05 12 views
5

मेरे ऐप में एक चैट घटक है जिसमें JTextArea है। अब, मैं एक विशिष्ट पाठ (जैसे छात्र: // xxxx) के लिए एक एक्शनलिस्टर-जैसी घटना कैसे जोड़ सकता हूं?JTextArea के अंदर एक विशिष्ट पाठ के लिए ActionListener?

तो जब मैं उस पाठ पर क्लिक करता हूं (छात्र: // 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: इस छोटे से प्रोग्राम को आज़माएं, बस छात्र से पहले क्लिक करें: //, और एक संदेश पॉप अप होगा :-) –

+0

धन्यवाद, अच्छी तरह से दिखता है। मैं इसे आजमाऊंगा। –

+0

हे, आप सबसे ज्यादा स्वागत करते हैं और स्माइलिंग करते हैं :-) –

2

नहीं, एक्शनलिस्टर्स जेबट्टन के लिए हैं या सार बटन से व्युत्पन्न कुछ भी नहीं है, लेकिन JTextComponents (JTextFields को छोड़कर) के लिए नहीं, क्योंकि यह भी इस पर विचार न करें। शायद आप एक माउस लिस्टर चाहते हैं।

यह कहकर, शायद आप दो पाठ घटकों, उपयोगकर्ता के समेत सभी प्रतिक्रियाओं को प्रदर्शित करने के लिए एक JTextArea से बेहतर हो जाएंगे, और इसके नीचे BorderLayout.SOUTH प्रकार की स्थिति में, उपयोगकर्ता को अनुमति देने के लिए एक JTextField बातचीत में पाठ दर्ज करने के लिए। फिर उस JTextField को एक एक्शनलिस्टर दें (यह कानूनी है) ताकि "प्रवेश" श्रोता को क्रियान्वित करे।

संपादित करें 1
आप राज्य:

खैर मुझे लगता है कि JTextField, उस में पाठ सर्वर के लिए भेजा जा रहा है है और सर्वर सभी ग्राहकों जो JTextArea में प्रकट होता है को संदेश भेजता है। लेकिन मेरी समस्या यहां है: जब कोई छात्र पर क्लिक करता है तो मैं एक खिड़की पॉप अप करना चाहता हूं: // id text।

हाँ, अपनी टिप्पणी को देख, मेरा वोट आप एक JTextArea में नहीं बल्कि एक JList, एक SelectionListener के साथ एक में अपनी बातचीत को प्रदर्शित करने के लिए है। फिर आप माउस क्लिक इवेंट्स को आसानी से जवाब दे सकते हैं, और "लाइन" से अधिक आसानी से उपयोगी जानकारी प्राप्त करेंगे (यदि आप स्मार्ट ऑब्जेक्ट्स के साथ जेएलिस्ट भरते हैं)। आपको एक कस्टम सेल रेंडरर लिखना होगा जो टेक्स्ट की कई पंक्तियों को प्रदर्शित करने की अनुमति देता है, शायद एक जो JTextArea दिखाता है, लेकिन जेएलिस्ट पर ट्यूटोरियल आपको इस पर शुरू कर देगा।

+0

हाँ आप सही mouselistener काम कर सकते हैं कर रहे हैं, लेकिन मैं कैसा प्रदर्शन करते हैं जब मैं एक ऐसे पाठ पर क्लिक करता हूं जो छात्र की तरह दिखता है: // id? –

+0

@ उपयोगकर्ता 1266039: आप यह व्यवहार क्यों चाहते हैं? इसका समग्र लक्ष्य क्या है? मैं यह नहीं कह रहा हूं कि आप जो अनुरोध करते हैं वह नहीं किया जा सकता है, लेकिन इसके लिए थोड़ा सा काम करने की आवश्यकता होगी, और व्यवहार थोड़ा मजाकिया लगता है क्योंकि अधिकांश चैट एप्लिकेशन जिनके बारे में मैं परिचित हूं, में यह कार्यक्षमता नहीं है। –

+1

मुझे दृढ़ता से संदेह है कि ओपी चैट को हाइपरलिंक की तरह कुछ करना चाहता है :-) – 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); 
    } 
} 
संबंधित मुद्दे