6

if else 構造を使用せずに Java で多数の JTextfields を検証する方法はありますか。13 個のフィールドのセットがあります。13 個のフィールドのいずれにもエントリが指定されていない場合にエラー メッセージを表示し、その特定のテキスト ボックスにフォーカスを設定できるようにします。これは、ユーザーが空のデータをデータベースに入力するのを防ぐためです。以下のようなif else構造なしでこれを達成する方法を誰かが教えてくれませんか。

if (firstName.equals("")) {
    JOptionPane.showMessageDialog(null, "No data entered");
} else if (lastName.equals("")) {
    JOptionPane.showMessageDialog(null, "No data entered");
} else if (emailAddress.equals("")) {
    JOptionPane.showMessageDialog(null, "No data entered");
} else if (phone.equals("")) {
   JOptionPane.showMessageDialog(null, "No data entered");
} else {
 //code to enter values into MySql database

上記のコードは、submit registration ボタンの actionperformed メソッドの下にあります。MySQL のフィールドを NOT NULL に設定しているにもかかわらず、空の文字列が Java GUI から受け入れられていました。どうしてこれなの?検証メッセージをカスタマイズできる空の文字列の例外がスローされる可能性があることを望んでいましたが、空のフィールドが受け入れられていたため、カスタマイズできませんでした。

ありがとう

4

4 に答える 4

6

コア Swing で利用可能な機能を使用する、再利用可能な検証セットアップのデモンストレーションを小指でひきつらせます。

協力者:

  • 検証ロジックを含む InputVerifier。ここでは、検証でフィールドの空のテキストをチェックしているだけです。ご了承ください
    • verify に副作用があってはなりません
    • shouldYieldFocus をオーバーライドして、フォーカス トラバーサルを制限しないようにする
    • すべてのテキスト フィールドで同じインスタンスです
  • inputVerifier (存在する場合) を明示的に呼び出して親のすべての子の有効性をチェックし、無効なものがあれば何もしない commit アクション
  • 入力フィールドのラベルを取得する非常に単純だが一般的に利用可能なエラーメッセージのメカニズム

いくつかのコード スニペット

// a reusable, shareable input verifier
InputVerifier iv = new InputVerifier() {

    @Override
    public boolean verify(JComponent input) {
        if (!(input instanceof JTextField)) return true;
        return isValidText((JTextField) input);
    }

    protected boolean isValidText(JTextField field) {
        return field.getText() != null && 
                !field.getText().trim().isEmpty();
    }

    /**
     * Implemented to unconditionally return true: focus traversal
     * should never be restricted.
     */
    @Override
    public boolean shouldYieldFocus(JComponent input) {
        return true;
    }

};
// using MigLayout for lazyness ;-)
final JComponent form = new JPanel(new MigLayout("wrap 2", "[align right][]"));
for (int i = 0; i < 5; i++) {
    // instantiate the input fields with inputVerifier
    JTextField field = new JTextField(20);
    field.setInputVerifier(iv);
    // set label per field
    JLabel label = new JLabel("input " + i);
    label.setLabelFor(field);
    form.add(label);
    form.add(field);
}

Action validateForm = new AbstractAction("Commit") {

    @Override
    public void actionPerformed(ActionEvent e) {
        Component source = (Component) e.getSource();
        if (!validateInputs(source.getParent())) {
            // some input invalid, do nothing
            return;
        }
        System.out.println("all valid - do stuff");
    }

    protected boolean validateInputs(Container form) {
        for (int i = 0; i < form.getComponentCount(); i++) {
            JComponent child = (JComponent) form.getComponent(i);
            if (!isValid(child)) {
                String text = getLabelText(child);
                JOptionPane.showMessageDialog(form, "error at" + text);
                child.requestFocusInWindow();
                return false;
            }
        }
        return true;
    }
    /**
     * Returns the text of the label which is associated with
     * child. 
     */
    protected String getLabelText(JComponent child) {
        JLabel labelFor = (JLabel) child.getClientProperty("labeledBy");
        return labelFor != null ? labelFor.getText() : "";
    }

    private boolean isValid(JComponent child) {
        if (child.getInputVerifier() != null) {
            return child.getInputVerifier().verify(child);
        }
        return true;
    }
};
// just for fun: MigLayout handles sequence of buttons 
// automagically as per OS guidelines
form.add(new JButton("Cancel"), "tag cancel, span, split 2");
form.add(new JButton(validateForm), "tag ok");
于 2012-12-26T14:14:24.913 に答える
5

これを行うには複数の方法があります。

 JTextField[] txtFieldA = new JTextField[13] ;
 txtFieldFirstName.setName("First Name") ; //add name for all text fields
 txtFieldA[0] = txtFieldFirstName ;
 txtFieldA[1] = txtFieldLastName ;
 ....

 // in action event
 for(JTextField txtField : txtFieldA) {
   if(txtField.getText().equals("") ) {
      JOptionPane.showMessageDialog(null, txtField.getName() +" is empty!");
      //break it to avoid multiple popups
      break;
   }
 }

また、フレームワークが Swing アプリケーションでのユーザー入力の検証を支援し、検証エラーと警告の報告を支援するJGoodies Validationもご覧ください。

于 2012-12-25T17:50:36.530 に答える
4

これら 3 つの JTextField の配列を取得して、概要を説明します

JTextField[] fields = new JTextField[13] 
field[0] = firstname;
field[1] = lastname; //then add remaining textfields

for(int i = 0; i < fields.size(); ++i) {
if(fields[i].getText().isEmpty())
   JOptionPane.showMessageDialog(null, "No data entered");
}

私が間違っている場合は訂正してください。私は Swing や awt.HTH に精通していません :)

于 2012-12-25T17:49:07.620 に答える
2

これを行う1つの方法は次のとおりです。

public static boolean areAllNotEmpty(String... texts)
{
    for(String s : texts) if(s == null || "".equals(s)) return false;
    return true;
}

// ...

if(areAllNotEmpty(firstName, lastName, emailAddress, phone))
{
    JOptionPane.showMessageDialog(null, "No data entered");
}
于 2012-12-25T17:48:24.627 に答える