2011-12-21 2 views
-3

Привет, я использовал 4 JTextField в моей форме swing. Мне нужно сделать перемещение фокуса с одного JTextField на другой JTextField, нажав клавишу ввода и клавишу tab.i сделали это успешно, но проблема была JTextField допускает только числовые значения, если я даю какое-либо значение, отличное от числового значения в текстовом поле J, которое заблокировано JTextField, и между JTextFields и кодом i не происходит переноса передачи.Захват всех входов в JTextField

package focus; 
    import java.awt.Component; 
    import java.awt.FlowLayout; 
    import java.awt.event.FocusAdapter; 
    import java.awt.event.FocusEvent; 
    import java.awt.event.KeyAdapter.*; 
    import java.awt.event.KeyEvent; 
    import java.awt.event.KeyListener; 
    import javax.swing.JFrame; 
    import javax.swing.JTextField; 
    import javax.swing.text.JTextComponent; 

    public class Main implements KeyListener{ 
     JTextField txt1 = new JTextField(20); 
     JTextField txt2 = new JTextField(20); 
     JTextField txt3 = new JTextField(20); 
     JTextField txt4 = new JTextField(20); 
     JFrame f = new JFrame(); 
     public Main() 
     { 

     txt1.addFocusListener(new MyFocusListener<JTextField>()); 
     txt2.addFocusListener(new MyFocusListener<JTextField>()); 
     txt3.addFocusListener(new MyFocusListener<JTextField>()); 
     txt4.addFocusListener(new MyFocusListener<JTextField>()); 
     txt1.addKeyListener(this); 
      txt2.addKeyListener(this); 
      txt3.addKeyListener(this); 
     txt4.addKeyListener(this); 
     f.setLayout(new FlowLayout()); 
     f.add(txt1); 
     f.add(txt2); 
     f.add(txt3); 
      f.add(txt4); 
     f.pack(); 
     f.setVisible(true);} 

     public static void main(String[] argv) throws Exception { 
      new Main(); 

     } 

     public void keyTyped(KeyEvent e) { 

     } 

     public void keyPressed(KeyEvent ke) { 
        if (ke.getSource() == txt1) 
     { 
     if (ke.getKeyCode() == KeyEvent.VK_ENTER) 
     { 
      txt2.requestFocusInWindow(); 
      txt2.selectAll(); 
     } 
     } 
     else if (ke.getSource() == txt2) 

     { 
     if (ke.getKeyCode() == KeyEvent.VK_ENTER) 
     { 
      txt3.requestFocusInWindow(); 
      txt3.selectAll(); 
     } 
     } 
     else if (ke.getSource() == txt3) 
     { 
     if (ke.getKeyCode() == KeyEvent.VK_ENTER) 
     { 
      txt4.requestFocusInWindow(); 
      txt4.selectAll(); 
       } 
     } 
    else if (ke.getSource() == txt4) 
     { 
     if (ke.getKeyCode() == KeyEvent.VK_ENTER) 
     { 
      txt1.requestFocusInWindow(); 
      txt1.selectAll(); 
       } 
     } 

     } 

     public void keyReleased(KeyEvent e) { 

     } 
    } 
    class MyFocusListener <C extends JTextField> extends FocusAdapter { 
     //boolean showingDialog = false; 
     public void focusGained(FocusEvent evt) { 
     final JTextComponent c = (JTextComponent) evt.getSource(); 
     String s = c.getText(); 
     c.requestFocus(); 
     c.selectAll(); 
     for (int i = 0; i < s.length(); i++) { 
     if (!Character.isDigit(s.charAt(i))) { 
     c.setSelectionStart(i); 
     c.setSelectionEnd(i); 
      break; 
     } 
     } 
     } 

     public void focusLost(FocusEvent evt) { 
     final JTextComponent c = (JTextComponent) evt.getSource(); 
     String s = c.getText(); 

     if (evt.isTemporary()) { 
     return; 
     } 
     for (int i = 0; i < s.length(); i++) { 
     if (!Character.isDigit(s.charAt(i))) { 
      //System.out.println("must only contain digits"); 
      c.requestFocus(); 
      c.selectAll(); 
      break; 
      } 
     } 
     } 

    } 
+1

В чем вопрос? – Jonas

+0

повторение @camickr в http://stackoverflow.com/questions/8585544/enter-key-using-in-jtextfield-java Do. Не. Используйте. KeyListener. Добавление: не используйте также focusListener ;-) – kleopatra

+1

-1 для совсем не обучения (см. Http://stackoverflow.com/questions/8585544/enter-key-using-in-jtextfield-java) – kleopatra

ответ

1
  1. Нет необходимости вызывать c.requestFoucs() в focusGained(). Компонент уже получил фокус, поэтому этот метод называется.
  2. Это предположение, но может быть правильным: «То, что вы делаете, - это проверить, имеет ли текстовое поле все числовые символы, а если нет, то вызовите c.requestFocus() в методе focusLost(). Поэтому, когда фокус теряется из компонента (textField) и потому содержит нечисловые символы, он снова получает фокус, и вы не видите никакого обхода фокуса ».
2

Это было так, потому что вы сделали это себя так :)

FIX: В focusLost, замените if (!Character.isDigit(s.charAt(i)))

с

if (!Character.isLetterOrDigit(s.charAt(i)))


public void focusLost(FocusEvent evt) { 
     final JTextComponent c = (JTextComponent) evt.getSource(); 
     String s = c.getText(); 

     if (evt.isTemporary()) { 
     return; 
     } 
     for (int i = 0; i < s.length(); i++) { 
     if (!Character.isLetterOrDigit(s.charAt(i))) { 

      c.requestFocus(); 
      c.selectAll(); 
      break; 
      } 
     } 
     } 

или просто

удалить всю вещь :) видеть комментарии.

+1

ehhh .. no ;-). Опции для проверки валидации: a) InputVerifier, если это нужно сделать на focusLost, b) DocumentFilter, если вы не хотите, чтобы разрешить ввод недействительных символов вообще ... – kleopatra

+0

@kleopatra см., Что он был отредактирован в в той же секунде, которую вы прокомментировали: D – COD3BOY

+0

да, см. его - но все еще выполняю проверку в focusListener .. просто не делайте ;-) – kleopatra

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