java 如何纠正“过度敏感”的JTextField输入问题

mccptt67  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(98)

我刚刚从BASIC过渡到JAVA,所以请原谅我在编码中遇到的任何约定问题。
我有一个温和的影响GUI相关的问题。我已经构建了一个矩阵乘法计算器,它对输入的字母进行计算(使用MOD 26)。我在Eclipse上专门运行该程序,并在下面包含了实际程序的操作图片...
问题出在接受输入字母的Jtextfield框上:
Actual program running on Eclipse
基本上,我希望能够在一个框中输入一个字母,然后将光标移动到下一个框(在输入所有字母后循环回到第一个框)。我使用了“KeyListener”,如第一个JTextField“letter box”的代码所示:

A_RUCE = new JTextField(2);
  A_RUCE.setFont(new Font("Serif", Font.PLAIN, 18));
  A_RUCE.setEditable(true);
  cp.add(A_RUCE);
  A_RUCE.setText("");
  
  A_RUCE.addKeyListener(new KeyAdapter(){
      public void keyPressed(KeyEvent e){
      String value=A_RUCE.getText();
      if(value.length()==0){
          B_RUCE.requestFocus();
      }
    }
  });

问题是,当我运行程序时,大多数时候,这个东西变得“过于敏感”。我试图输入一个字母,光标跳过一个框。我考虑了电脑上的按键重复率等,并调整了设置,但这没有帮助。
所有我正在寻找的是当一个字母被输入,光标移动到下一个框没有'跳过'一个框。我不知道为什么会发生这种情况,我不能想出一个替代的方法来解决这个问题。我会非常感激,如果有人能帮助这个。谢谢你亲切。

ozxc1zmp

ozxc1zmp1#

我更倾向于使用DocumentListener,你可以检查文本的长度,然后转到下一个字段,这是你可以做的事情:

import java.awt.Component;
import java.awt.Container;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JPanel;
import java.awt.EventQueue;
import javax.swing.event.DocumentListener;
import javax.swing.event.DocumentEvent;

public class FB extends JFrame implements DocumentListener {
    private JTextField[] fields = new JTextField[3];

    public void insertUpdate(DocumentEvent e) {
        int textLen = e.getDocument().getLength();
        if (textLen == 1) {
            // focus next
            int nextToFocus = 0;
            Component c = getFocusOwner();
            for (int i = 0; i < fields.length; i++) {
                if (fields[i] == c) {
                    nextToFocus = i + 1;
                    break;
                }
            }
            nextToFocus %= fields.length;
            System.out.printf("Next to focus is field %d%n", nextToFocus);
            fields[nextToFocus].requestFocus();
        }
    }

    public void removeUpdate(DocumentEvent e) {
    } // No-op

    public void changedUpdate(DocumentEvent e) {
        // No-op
    }

    private void setGui() {
        try {
            setLocation(0, 100);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            Container cp = getContentPane();
            JPanel fieldsPanel = new JPanel();
            for (int i = 0; i < fields.length; i++) {
                JTextField tf = new JTextField(1);
                tf.getDocument().addDocumentListener(this);
                fieldsPanel.add(tf);
                fields[i] = tf;
            }
            setContentPane(fieldsPanel);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            EventQueue.invokeAndWait(() -> {
                FB f = new FB();
                f.setGui();
                f.setSize(200, 200);
                f.setVisible(true);
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

相关问题