2012-03-22 8 views
7

W mojej aplikacji znajduje się cztery pola tekstowe i chcę wprowadzić tylko cztery znaki w jednym obszarze tekstowym, a kursor automatycznie przechodzi do następnego pola testowego. Ponownie, gdy wprowadzę cztery znaki w tym obszarze tekstowym, ponownie kursor automatycznie przejdzie do następnego pola tekstowego.Java: Jak kursor automatycznie przemieszcza się z jednego pola tekstowego do innego

Przykład: W momencie instalowania Window XP wymagany jest "Key", a po wprowadzeniu czterech znaków w pierwszej sekcji są cztery sekcje, a następnie kursor automatycznie przechodzi do następnej sekcji.

To samo chcę w mojej aplikacji.

W tym przede wszystkim dodam CustomizedTextFields.jar a następnie stworzył cztery IntegerField:

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

po to pokażę te wszystkie IntegerField na mojej klatce.

Teraz Próbowałem ten kod, aby wysłać kursor do następnego pola, ale to nie działa:

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

dla lepszej pomaga szybciej, POST [SSCCE] (http://sscce.org/). –

Odpowiedz

10

wystarczająco interesująca pytanie spróbować poprawy mój niewyraźny znajomość pakietu tekst: -)

Istnieją dwa oddzielne wymagania tutaj

  • ograniczyć długość tekstu: że zrobił z DocumentFilter jak @mKorbel już zauważyć
  • automatycznie transferFocus do następnego elementu po osiągnięciu max długość: Okazuje się, że można zrobić z NavigationFilter

w kodzie:

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 jest jednym z Swing Tutorial

+0

@Vinit Vikash, a to jest odpowiedź na twoje pytanie – mKorbel

+0

@kleopatra: +1 dla NavigationFilter. Właściwie, do dziś, ten termin nie był w mojej wiedzy :-). Ciągle czytając o tym, czuję, że to, co powiedziałeś, jest drogą do zrobienia, ponieważ miałem nadzieję, że ktoś może rzucić więcej światła na to, dlatego wysłałem odpowiedź, inaczej nigdy nie chciałem. –

+0

Ale gdy zastosowałem 'transferFocus()' wewnątrz 'NavigationFilter', nic się nie zmieniło, więc jeśli możesz, zaksięguj cały kod, będę naprawdę zobowiązany. –

1

Wymień text2.getCursor() z text2.requestFocus().

getCursor() służy do pobierania kształtu wskaźnika myszy po najechaniu kursorem na element.

Ponadto za pomocą tej metody nadal można wprowadzić więcej niż 4 znaki w polu, na przykład wklejając ze schowka. Jeśli chcesz to zablokować, musisz sprawdzić, czy wpisany tekst ma więcej niż 4 znaki, a jeśli tak, to zrób tylko pierwsze 4 znaki.

1

Coś jak to powinno działać:

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

Gdzie text2 jest kolejnym textfield

+1

w ogóle nie używać keyListeners ... w szczególności do sprawdzania poprawności wprowadzania tekstu, zamiast tego patrz odpowiedź @ 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. dodać DocumentListener do JTextComponents, do słuchania dodać DocumentFilter

  2. don” t użyj KeyListener dla JTextComponents stosować wyłącznie DocumentListener

  3. dodatek wymaganą obok JTextArea do DocumentListener, jeśli jest tam wpisane 4-ci.Char do JTextArea,

  4. zawiadomienie, poruszając się z Focus od jednego JTextArea do drugiego będzie lepiej opakowane w 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

nie używać w ogóle keyListeners ... w szczególności do sprawdzania poprawności wprowadzania tekstu, zamiast tego patrz odpowiedź @ mKorbela. I nie dodawaj niepotrzebnego sprzężenia: zamiast twardego kodowania nextComponent, wywołaj transferFocus na bieżącym – kleopatra

+0

Witam, dzięki za informację zwrotną. Jeśli nie masz nic przeciwko, dlaczego powinienem unikać keyListeners? Czy istnieje prosta odpowiedź? Dzięki – Reg

+1

@reg: W Swing staramy się zrobić [KeyBinding] (http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html), a ponadto zawsze preferujemy 'requestFocusInWindow()' over ' requestFocus() ', Co więcej, zawsze staraj się używać' tArea.getDocument(). getLength() 'over' tArea.getText(). length() ':-) –

0

wystarczy tylko stworzyć i przejdź do textarea Najważniejsze wydarzenia wpisane den u może napisać ten

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

} 
Powiązane problemy