Java: как курсор автоматически перемещается из одного текстового поля в другое

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

пример: во время установки окна XP он хочет "ключ", и есть четыре раздела, когда вы вводите четыре символа в первом разделе, а затем курсор автоматически перемещается в следующий раздел.

то же самое я хочу в свое заявление.

для этого прежде всего я добавляю CustomizedTextFields.jar, а затем создал четыре целых поля:

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) {
            }
        });

6 ответов


достаточно интересный вопрос, чтобы попытаться улучшить мои теневые знания текстового пакета : -)

здесь есть два отдельных требования

  • ограничить длину текста: это делается с помощью 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 является одним из Качели Уроке


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. не используйте KeyListener на JTextComponents используйте только DocumentListener

  3. добавить необходимое рядом JTextArea до DocumentListener, если есть тип 4th. Голец в JTextArea,

  4. обратите внимание, двигаясь с Focus от JTextArea к другому было бы лучше обернуть в invokeLater


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;
    }
}

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

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

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


что-то вроде этого должно работать:

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

где текст2 следующий текст


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

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

 }