0

これは私のコードで、2 つのテキスト フィールドがtf1ありtf2ます。

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
4

1 に答える 1

3

ドキュメントによると、フォーカスが緩んverify()でいるときにメソッドが呼び出されます。JTextFieldコードで、tf1okbtn をクリックするとフォーカスが失われます。したがって、verify()tf1 のメソッドが呼び出されて print されますin tf1

actionPerformed では、verify()メソッドを明示的に呼び出すので、出力in tf2されます。は空であるためtf2(つまり、JPanel で追加した行はコメント化されています):JOptionPane表示false in tf2

これらの説明がコードの修正に役立つことを願っています。自分自身を呼び出す必要がないことを理解する必要がありverify()ます。フィールドがフォーカスを失ったときに、swing フレームワークによって自動的に呼び出されます。

于 2013-10-04T09:45:20.750 に答える