2012-03-22 1 views
7

В моем приложении есть четыре TextArea, и я хочу ввести только четыре символа в одной области текста, и курсор автоматически переместится в следующий TestArea. Снова, когда я ввожу четыре символа в этот TextArea, тогда снова курсор автоматически переходит к следующему TextArea.Java: как курсор автоматически перемещается из одного текстового поля в другой.

Пример: Во время установки Window XP требуется «Ключ», и есть четыре раздела, когда вы вводите четыре символа в первом разделе, затем курсор автоматически переходит к следующему разделу.

То же самое, что я хочу в своем приложении.

Для этого в первую очередь добавить CustomizedTextFields.jar, а затем создал четыре IntegerField:

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

после этого я показать все эти 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

@Vinit Vikash и это ответ на ваш вопрос – mKorbel

+0

@kleopatra: +1 для NavigationFilter. Собственно, до сегодняшнего дня этот термин не был мне в курсе :-). По-прежнему читаешь об этом, чувствуешь, что то, что ты сказал, - это путь, потому что я надеялся, что кто-то может рассказать об этом, поэтому я отправил ответ, иначе я никогда не хотел. –

+0

Но когда я применил 'transferFocus()' inside' NavigationFilter', ничего не изменилось, поэтому, если вы можете опубликовать весь код, я буду действительно обязан. –

1

Заменить text2.getCursor() с text2.requestFocus().

getCursor() предназначен для получения формы указателя мыши при наведении указателя мыши на компонент.

Кроме того, с помощью этого метода все еще возможно ввести более четырех символов в поле, например, вставкой из буфера обмена. Если вы хотите заблокировать это, вам нужно будет проверить, если введенный текст длиннее 4 символов, и если да, возьмите только первые 4 символа.

1

Что-то, как это должно работать:

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

Где text2 ваш следующий TextField

+1

не используют keyListeners вообще ... особенно не для проверки ввода текста, а вместо этого см. Ответ @ 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. добавить DocumentListener к JTextComponents, для прослушивания добавить DocumentFilter

  2. Дон» t использовать KeyListener для JTextComponents используйте только DocumentListener

  3. надстройку необходимой следующим JTextArea к DocumentListener, если там набираются четвёртое.Чар в JTextArea,

  4. уведомления, перемещаясь с Focus от одного JTextArea к другому был бы лучше, завернутым в 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

вообще не используют keyListeners ... особенно для проверки ввода текста, вместо этого см. Ответ @ mKorbel. И не добавляйте ненужную связь: вместо жесткого кодирования nextComponent, call transferFocus на текущем – kleopatra

+0

Привет, Спасибо за отзыв. Если вы не возражаете, почему я должен избегать keyListeners? Есть простой ответ? Спасибо – Reg

+1

@reg: В Swing мы пытаемся сделать [KeyBinding] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) и, кроме того, всегда предпочитаем 'requestFocusInWindow()' over ' requestFocus() ', Кроме того, всегда пытайтесь использовать' tArea.getDocument(). getLength() 'over' tArea.getText(). length() ':-) –

0

просто просто создать текстовое поле и перейти к ключевые события, набранные ден U может написать эту

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

} 
Смежные вопросы