【问题标题】:Input Verifier on JTextField returns incorrectJTextField 上的输入验证器返回不正确
【发布时间】:2013-10-11 05:14:45
【问题描述】:

这是我的代码,我有两个文本字段,tf1tf2

public class MyInputVerifier extends InputVerifier {
@Override
public boolean verify(JComponent input) {
    String name = input.getName();
    if (name.equals("tf1")) {
        System.out.println("in tf1");
        String text = ((JTextField) input).getText().trim();
        if (text.matches(".*\\d.*")) return false;       // have digit
    }
    else if (name.equals("tf2")) {
        System.out.println("in tf2");
        String text = ((JTextField) input).getText().trim();
        if (isNumeric2(text)) return true;
    }
    return false;
}

public boolean isNumeric2(String str) {
    try {
        Integer.parseInt(str);
        return true;
    } catch (Exception e) {
        return false;
    }
}

public static class Tester extends JFrame implements ActionListener {
    JTextField tf1, tf2;
    JButton okBtn;

    public Tester() {
        add(panel(), BorderLayout.CENTER);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 500);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Tester();
            }
        });
    }

    public JPanel panel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        okBtn = new JButton("Ok");
        okBtn.addActionListener(this);
        tf1 = new JTextField(10);
        tf1.setName("tf1");
        tf2 = new JTextField(10);
        tf2.setName("tf2");
        tf1.setInputVerifier(new MyInputVerifier());
        tf2.setInputVerifier(new MyInputVerifier());
        panel.add(tf1);
//            panel.add(tf2);
        panel.add(okBtn);
        return panel;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        MyInputVerifier inputVerifier = new MyInputVerifier();
        if (e.getSource() == okBtn) {
            if (inputVerifier.verify(tf2)) {
                JOptionPane.showMessageDialog(null, "True in tf2");
            } else JOptionPane.showMessageDialog(null, "False in tf2");
        }
    }
}
}

输出:

我输入 10

on joption pane: false in tf2
on console: in tf1
            in tf2

【问题讨论】:

  • 到底是什么问题?反正用新的 InputVerifier 手动验证字段看起来很可疑,你想达到什么目的?
  • @kleopatra 我输入10,所以应该返回true并在控制台中显示True in tf2,也不显示in tf1

标签: java swing jtextfield inputverifier


【解决方案1】:

根据doc verify() 方法在JTextField 失去焦点时被调用。在您的代码中,当您单击 okbtn 时,tf1 会失去焦点。于是调用了tf1的verify()方法,打印出in tf1

在 actionPerformed 中,您显式调用 verify() 方法,因此会打印 in tf2。由于tf2 是空的(即在JPanel 中添加它的行被注释):JOptionPane 显示false in tf2

我希望这些解释能帮助您修复代码。你必须明白,你不需要自己调用verify(),它会在字段失去焦点时被swing框架自动调用。

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 2015-05-20
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2016-01-21
    • 1970-01-01
    相关资源
    最近更新 更多