2012-03-22 17 views
7

में मेरे एप्लिकेशन में चार टेक्स्ट एरिया है और मैं एक टेक्स्ट क्षेत्र में केवल चार वर्ण दर्ज करना चाहता हूं और कर्सर स्वचालित रूप से अगले टेस्टएरिया में स्थानांतरित हो जाता है। फिर जब मैं इस टेक्स्ट एरिया में चार वर्ण दर्ज करता हूं तो फिर कर्सर स्वचालित रूप से अगले टेक्स्ट एरिया में जाता है।जावा: कैसे कर्सर स्वचालित रूप से एक टेक्स्टफ़ील्ड से दूसरे

उदाहरण: विंडो एक्सपी इंस्टॉल करने के समय इसे "कुंजी" चाहिए और जब आप पहले सेक्शन में चार वर्ण दर्ज करते हैं तो चार अनुभाग होते हैं तो कर्सर स्वचालित रूप से अगले खंड में जाता है।

वही चीज़ जो मैं अपने आवेदन में चाहता हूं। इस के बाद

private IntegerField text1; 
private IntegerField text2; 
private IntegerField text3; 
private IntegerField text4; 

मैं अपने फ्रेम पर इन सभी IntegerField दिखाने:

सभी की यह पहली मैं CustomizedTextFields.jar जोड़ने और फिर चार IntegerField बनाया।

अब मैं इस कोड की कोशिश की अगली फ़ील्ड पर कर्सर को भेजने के लिए, लेकिन यह काम नहीं कर रहा:

text1.addKeyListener(new KeyListener() { 
      @Override 
      public void keyTyped(KeyEvent e) { 
        int a2 = text1.getText().length(); 
        if (a2 == 3) { 
         text2.getCursor(); 
        } 
      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
      } 

      @Override 
      public void keyPressed(KeyEvent e) { 
      } 
     }); 
+0

बेहतर मदद जल्दी के लिए लिख सकते हैं, एक [SSCCE] (http://sscce.org/) पोस्ट करते हैं। –

उत्तर

10

काफी दिलचस्प सवाल में लपेटा किया जाएगा: -)

यहां दो अलग-अलग आवश्यकताएं हैं

  • पाठ की लंबाई को प्रतिबंधित: कि एक DocumentFilter साथ किया जाता है के रूप में @mKorbel पहले से ही अगले घटक को
  • स्वचालित रूप से transferFocus ध्यान दिया के बाद अधिकतम लंबाई तक पहुँच जाता है: कि एक NavigationFilter
साथ किया जा सकता पता चला है कोड में

:

JComponent panel = new JPanel(); 
final int maxSize = 3; 
for (int i = 0; i < 4; i++) { 
    final JTextField field = new JTextField(5); 
    NavigationFilter filter = new NavigationFilter() { 

     @Override 
     public void setDot(FilterBypass fb, int dot, Bias bias) { 
      if (dot >= maxSize) { 
       fb.setDot(0, bias); 
       field.transferFocus(); 
       return; 
      } 
      fb.setDot(dot, bias); 
     } 

     @Override 
     public void moveDot(FilterBypass fb, int dot, Bias bias) { 
      if (dot >= maxSize) { 
       fb.setDot(0, bias); 
       field.transferFocus(); 
       return; 
      } 
      fb.moveDot(dot, bias); 
     } 

    }; 
    field.setNavigationFilter(filter); 
    ((AbstractDocument) field.getDocument()).setDocumentFilter(new DocumentSizeFilter(maxSize)); 
    panel.add(field); 
} 

documentFilter बस सिर्फ पाठ क्षेत्र बना सकते हैं और करने के लिए जाना Swing Tutorial

+0

@ विनीत विकास और यह आपके प्रश्न का उत्तर – mKorbel

+0

@ क्लोपेट्रा: नेविगेशनफिल्टर के लिए +1 है। असल में, आज तक, यह शब्द मेरे ज्ञान में नहीं था :-)। अभी भी इसके बारे में पढ़ना, ऐसा लगता है कि आपने जो कहा था वह जाने का तरीका है, क्योंकि मैं उम्मीद कर रहा था कि कोई इस पर अधिक प्रकाश डाल सकता है, इसलिए मैंने जवाब पोस्ट किया, और मैं कभी नहीं चाहता था। –

+0

लेकिन, जब मैंने 'नेविगेशनफिल्टर' के अंदर 'ट्रांसफर फोकस() 'लागू किया, तो कुछ भी नहीं बदला, इसलिए यदि आप पूरे कोड को पोस्ट कर सकते हैं, तो मैं वास्तव में बाध्य होगा। –

1

text2.requestFocus() साथ text2.getCursor() बदलें।

getCursor() किसी घटक पर होवर करते समय माउस पॉइंटर के आकार को पुनर्प्राप्त करने के लिए है।

इसके अलावा, इस विधि के साथ एक फ़ील्ड में 4 से अधिक वर्ण दर्ज करना अभी भी संभव है, उदाहरण के लिए क्लिपबोर्ड से पेस्ट करके। यदि आप इसे अवरुद्ध करना चाहते हैं, तो आपको यह जांचना होगा कि दर्ज पाठ 4 वर्णों से अधिक लंबा है, और यदि ऐसा है, तो इससे केवल पहले 4 वर्ण लें।

1

इस तरह काम करना चाहिए:

text1.addKeyListener(new KeyAdapter(){ 
      public void keyPressed(KeyEvent e){ 
      String value=text1.getText(); 
      if(value.length()==4){ 
      text2.requestFocus(); 
      } 
} 

टेक्स्ट 2 कहाँ अपने अगले पाठ फ़ील्ड

+1

मुख्य लिस्टेनर्स का उपयोग न करें ... विशेष रूप से टेक्स्ट इनपुट को सत्यापित करने के लिए नहीं, इसके बजाय @ mkorbel का उत्तर – kleopatra

6
At the time of installing Window XP it want "Key" and there are four section 
when you enter four character in first section then cursor automatically move 
to the next section. 
  1. JTextComponents में जोड़ने DocumentListener, जोड़ने सुन DocumentFilter

  2. डॉन के लिए 'हैका उपयोग नहीं करें JTextComponents के लिए 85,383,210,, DocumentListener को केवल DocumentListener

  3. आवश्यक अगले JTextArea ऐड का उपयोग करता है, तो वहाँ टाइप किया 4 है।JTextArea में चार,

  4. नोटिस, एक JTextArea से दूसरी Focus के साथ आगे बढ़ बेहतर पाठ पैकेज की मेरी छायादार ज्ञान में सुधार करने की कोशिश करना invokeLater

2
import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 

public class NextBox extends JTextField { 
    private JComponent nextComponent; 


    public NextBox() { 
     addKeyListener(new KeyListener() { 

      @Override 
      public void keyTyped(KeyEvent e) {} 

      @Override 
      public void keyReleased(KeyEvent e) { 
       // Check for the four characters. 
       if (getText().length() >= 4) { 
        nextComponent.requestFocus(); 
       } 
      } 

      @Override 
      public void keyPressed(KeyEvent e) {} 
     }); 
    } 


    public static void main(String[] args) { 

     JFrame frame = new JFrame("Debug Frame"); 
     frame.setSize(400, 80); 
     frame.setLayout(new GridLayout(1,5)); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     NextBox box1 = new NextBox(); 
     NextBox box2 = new NextBox(); 
     NextBox box3 = new NextBox(); 
     NextBox box4 = new NextBox(); 
     JButton button1 = new JButton("Done"); 

     box1.setNextComponent(box2); 
     box2.setNextComponent(box3); 
     box3.setNextComponent(box4); 
     box4.setNextComponent(button1); 

     frame.add(box1); 
     frame.add(box2); 
     frame.add(box3); 
     frame.add(box4); 
     frame.add(button1); 

     frame.setVisible(true); 
    } 

    /** 
    * @param nextComponent the nextComponent to set 
    */ 
    public void setNextComponent(JComponent nextComponent) { 
     this.nextComponent = nextComponent; 
    } 

    /** 
    * @return the nextComponent 
    */ 
    public JComponent getNextComponent() { 
     return nextComponent; 
    } 
} 
+0

कुंजीलिस्टर्स का उपयोग न करें ... विशेष रूप से टेक्स्ट इनपुट को सत्यापित करने के लिए नहीं, इसके बजाय @ mkorbel का उत्तर देखें। और अनावश्यक युग्मन न जोड़ें: हार्ड-कोडिंग के बजाय अगला कॉम्पोनेंट, कॉल ट्रांसफर वर्तमान – kleopatra

+0

पर फ़ोकस करें, प्रतिक्रिया के लिए धन्यवाद। यदि आपको कोई फर्क नहीं पड़ता है, तो मुझे कुंजीलिस्टर्स से क्यों बचना चाहिए? क्या कोई आसान जवाब है? धन्यवाद – Reg

+1

@reg: स्विंग में हम [KeyBinding] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) करने का प्रयास करते हैं, और इसके अलावा, हमेशा 'requestFocusInWindow()' ' requestFocus() ', इसके अलावा, हमेशा' tArea.getDocument()। getLength() 'tArea.getText() पर उपयोग करने का प्रयास करें। लंबाई()' :-) –

0

से एक है कुंजी टाइप किया घटनाओं मांद यू इस

String number=jTextArea1.getText(); 
int l=number.length(); 
if(l==3){ 
jTextArea1.transferFocus(); 

} 
संबंधित मुद्दे