2011-12-21 63 views
-3

您好我在我的swing形式中使用了4个JTextField。我需要做的是将焦点从一个JTextField移动到其他JTextField,方法是敲入回车键和制表键key.i成功完成,但问题是JTextField只允许数字值,如果我在J Textfield中赋予除数值以外的任何值,则JTextField将被锁定,并且在JTextFields之间不会发生焦点传输。我使用的代码。捕获到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 2011-12-21 13:58:26

+0

重复@camickr在http://stackoverflow.com/questions/8585544/enter-key-using-in-jtextfield-java做。不。使用。 KeyListener的。添加:不要使用focusListener ;-) – kleopatra 2011-12-21 14:08:31

+1

-1根本不学习(请参阅http://stackoverflow.com/questions/8585544/enter-key-using-in-jtextfield-java) – kleopatra 2011-12-21 14:16:02

回答

1
  1. 不需要调用c.requestFoucs()focusGained()。组件已经得到了重点,这就是为什么这个方法被调用。
  2. 这是一个假设,但可能是正确的:“你正在做的是检查文本字段是否包含所有数字字符,如果没有,则在focusLost()方法中调用c.requestFocus()所以一旦焦点从组件(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 ..没有;-)处理验证的选项是a)InputVerifier,如果它应该在focusLost上完成,b)DocumentFilter,如果你不想允许插入无效字符...... – kleopatra 2011-12-21 14:11:03

+0

@kleopatra看到它被编辑在同样的第二个你评论:D – COD3BOY 2011-12-21 14:13:14

+0

是的,看到它 - 但仍然在focusListener中进行验证..根本不需要;-) – kleopatra 2011-12-21 14:17:26