2

ユーザーが他の文字を入力した場合、ユーザーにアルファベットまたは空白のみを入力してもらいたい、jOptionPaneでメッセージを表示したい 検索して、以下のコードを試しました

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText())))
        JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);

しかし、今は何を入力してもエラーが発生します

今、私はコードを変更しました

Pattern letterPattern = Pattern.compile("^[a-zA-Z]+$");

if (!(letterPattern.matcher(answerField1.getText()).matches()))
      {
    JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}

これで、ユーザーが最初に number を入力したときにのみメッセージが表示されます。どうすればこれを解決できますか

4

3 に答える 3

8

を使用しDocumentFilterます。これは私が作成した例です。アルファベット文字と空白のみを受け入れます。

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class Test {

    public Test() {
        initComponents();
    }

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

    private void initComponents() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JTextField jtf = new JTextField();
        //add filter to document
        ((AbstractDocument) jtf.getDocument()).setDocumentFilter(new MyDocumentFilter());

        frame.add(jtf);

        frame.pack();
        frame.setVisible(true);
    }
}

class MyDocumentFilter extends DocumentFilter {

    @Override
    public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
        for (int n = string.length(); n > 0; n--) {//an inserted string may be more than a single character i.e a copy and paste of 'aaa123d', also we iterate from the back as super.XX implementation will put last insterted string first and so on thus 'aa123d' would be 'daa', but because we iterate from the back its 'aad' like we want
            char c = string.charAt(n - 1);//get a single character of the string
            System.out.println(c);
            if (Character.isAlphabetic(c) || c == ' ') {//if its an alphabetic character or white space
                super.replace(fb, i, i1, String.valueOf(c), as);//allow update to take place for the given character
            } else {//it was not an alphabetic character or white space
                System.out.println("Not allowed");
            }
        }
    }

    @Override
    public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
        super.remove(fb, i, i1);
    }

    @Override
    public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
        super.insertString(fb, i, string, as);

    }
}
于 2012-12-27T19:20:11.127 に答える
1

最初の行の最後にセミコロンがあります。したがって、実際には正しくテストされていません。

このようなステートメント(これはあなたが持っているものです):

if (condition) ;

条件が真の場合、空のステートメント (;) を実行し、次の行に移動します。条件が false の場合、次の行に移動します。これら 2 つのアクションの結果は同じです。

すべての「if」ステートメントで中括弧を使用してみてください。面倒なこともありますが、めちゃくちゃにするのが難しくなります。

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) {
    JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}

それが私がすることです。セミコロンを削除するだけです。

于 2012-12-27T17:29:08.200 に答える
0

このコードはあなたを助けるかもしれません:

answerField1.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            char ch = e.getKeyChar();
            if(Character.isDigit(ch)){
                answerField1.setText("");
                JOptionPane.showMessageDialog(null, "Enter Alphabet Only !");
                                     }
                                            }
    });
于 2020-01-17T04:36:16.490 に答える