【问题标题】:Java: How cursor automatically move from one TextField to otherJava:光标如何自动从一个 TextField 移动到另一个
【发布时间】:2012-03-22 09:14:20
【问题描述】:

在我的应用程序中有四个 TextArea,我只想在一个文本区域中输入四个字符,光标会自动移动到下一个 TestArea。再次,当我在此 TextArea 中输入四个字符时,光标再次自动移动到下一个 TextArea。

示例:在安装Window XP时需要“Key”,当您在第一部分输入四个字符时有四个部分,然后光标自动移动到下一个部分。

我想要在我的应用程序中使用相同的东西。

为此,我首先添加了 CustomizedTextFields.jar,然后创建了四个 IntegerField:

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

【问题讨论】:

  • 如需尽快获得更好的帮助,请发帖SSCCE

标签: java swing awt


【解决方案1】:

足够有趣的问题来尝试提高我对文本包的模糊知识:-)

这里有两个不同的要求

  • 限制文本的长度:这是使用 DocumentFilter 完成的,正如 @mKorbel 已经指出的那样
  • 达到最大长度后自动将焦点转移到下一个组件:原来可以使用 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 来自Swing Tutorial

【讨论】:

  • @Vinit Vikash 这是您问题的答案
  • @kleopatra : NavigationFilter +1。实际上,直到今天,我还不知道这个词:-)。仍在阅读此内容,感觉就像您所说的那样是要走的路,因为我希望有人能对此有所了解,这就是我发布答案的原因,否则我不想这样做。
  • 但是,当我在NavigationFilter 中应用transferFocus() 时,没有任何改变,所以如果可以,请发布整个代码,我将非常感激。
  • @GagandeepBali 整个代码 - 只需将其放入您最喜欢的框架并运行它 :-)
  • 现在它可以工作了,大声笑,上次它给了我各种邪恶的错误。只是一件事,将maxSize 更改为 4,因为 OP 需要 4 个字符。删除我的答案:-)
【解决方案2】:
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. DocumentListener 中添加需要的下一个JTextArea,如果有第4 个。转成JTextArea

  4. 注意,使用 Focus 从一个 JTextArea 移动到另一个会更好地包裹到 invokeLater

【讨论】:

    【解决方案3】:

    text2.getCursor() 替换为text2.requestFocus()

    getCursor() 用于在鼠标悬停在组件上时检索鼠标指针的形状。

    此外,使用此方法仍可以在字段中输入超过 4 个字符,例如通过从剪贴板粘贴。如果你想阻止它,你需要检查输入的文本是否超过 4 个字符,如果是,只取前 4 个字符。

    【讨论】:

      【解决方案4】:

      这样的事情应该可以工作:

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

      text2 是你的下一个文本字段

      【讨论】:

      • 根本不要使用 keyListeners ......尤其不是用于验证文本输入,而是参见@mKorbel 的回答
      【解决方案5】:

      只需创建 textarea 并转到关键类型的事件 你可以写这个

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 2018-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多