【问题标题】:Capturing all inputs into JTextField将所有输入捕获到 JTextField
【发布时间】:2011-12-21 13:53:24
【问题描述】:

嗨,我在我的摇摆表单中使用了 4 个 JTextField。我需要做的是通过按 Enter 键和 Tab 键将焦点从一个 JTextField 移动到另一个 JTextField。我成功完成了,但问题是 JTextField 只允许数字如果我在 J Textfield 中给出除数值以外的任何值,则 JTextField 被锁定并且 JTextFields 之间没有发生焦点转移。我使用的代码。

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

    }

【问题讨论】:

标签: java swing jtextfield


【解决方案1】:

之所以这样,是因为你让它表现得像那样:)

修复: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;
          }
      }
        }

或者简单地说,

删除整个东西 :) 看看 cmets。

【讨论】:

  • ehhh .. no ;-) 处理验证的选项是 a) InputVerifier 如果应该在 focusLost 上完成,b) DocumentFilter 如果您根本不想允许插入无效字符...
  • @kleopatra 看到它在您评论的同一秒内被编辑:D
  • 是的,看到了 - 但仍在 focusListener 中进行验证 .. 根本不要;-)
  • 验证任何 Char_by_Char 是 DocumentListener 的工作,作为这个问题的答案 +1
  • @mKorbel 你的意思是 DocumentFilter(与 DocumentListener 相比),不是吗:-)
【解决方案2】:
  1. 无需在focusGained() 中调用c.requestFoucs()。组件已经获得焦点,这就是调用此方法的原因。
  2. 这是一个假设,但可能是正确的:“您正在做的是检查文本字段中是否包含所有数字字符,如果没有,则在 focusLost() 方法中调用 c.requestFocus()。所以一旦焦点从组件中丢失( textField) 并且由于包含非数字字符,它再次获得焦点,您看不到任何焦点遍历。”

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2021-03-16
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多