9

私の Swing アプリケーションでは、ユーザーは次のウィンドウに切り替える前に数値と値を挿入する必要があります。クリーンなプログラムのように、すべての入力が有効かどうかをチェックし、有効でない場合はエラー メッセージが表示され、次のウィンドウは開きません。

このチェックの構造は次のとおりです (例)。

Button buttonToOpenNextWindow = new JButton("next");
button.addActionListener(new ActionListener(){

    public void actionPerformed(ActionEvent e){
        if(checkValidty){
            // (...)
            new WindowA();
            frame.dispose(); // (*)
        }
    }
});

(*) 注:複数の JFrame の原則が醜いことはわかっています。私はそれを変更しようとしていますが、この質問には関係ありません。

今、この質問の焦点は thischeckValidity()であり、私は次のように構成しました:

private boolean checkValidity(){

    // check input 1
    try{
        Integer.parseInt(textField1.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input 1 is invalid!"); // own implemented dialog
        return false;
    }

    // check input 2
    try{
        Integer.parseInt(textField2.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input 2 is invalid!"); // own implemented dialog
        return false;
    }

    // (...)

    // check input n
    try{
        Integer.parseInt(textField_n.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input n is invalid!"); // own implemented dialog
        return false;
    }
    return true;
}

これは私が望むとおりに機能しますが、コード自体は非常に醜いです。複数の入力オプションがあると、メソッドが200行、300行、またはそれ以上の長さになるためです(たとえば、数値であるかどうかだけでなく、数値が意味をなすかどうかもチェックするため)プログラムロジックなどのコンテキストで)。そのようなことを確認する Swing 独自の方法はありますか? または、分割メソッドを使用してこの機能を正確に実現する方法を知っている人はいますか?

4

4 に答える 4

16

1 つの解決策は、Swing を使用して、使用さInputVerifierれるすべての入力を検証することJTextFieldです。検証機能は各フィールドで同じであるため、単一のインスタンスをすべてのコンポーネントに使用できます。

public class MyNumericVerifier extends InputVerifier {
    @Override
    public boolean verify(JComponent input) {
       String text = ((JTextField) input).getText();
       try {
          Integer.parseInt(text);
       } catch (NumberFormatException e) {
          return false;
       }

       return true;
    }
}

InputVerifier verifier = new MyNumericVerifier()
textField1.setInputVerifier(verifier);
于 2012-10-21T12:34:19.507 に答える
7

の改良版を使用することを好みJFormattedTextFieldます。改善とは、キャレットの動作の改善、各変更の検証によるユーザー フィードバックの即時提供 (入力が無効な場合の背景色の変更など) などを意味します。これは、入力が有効になるまで無効になるボタンと組み合わされています。

「ボタンをクリックしてエラーメッセージが表示されるのを確認する」よりも主な利点は次のとおりです。

  • ユーザーへの即時フィードバック。Web アプリケーションがサーバーへのラウンドトリップを回避し、JavaScript を使用して即時フィードバックを得ることができる場合、デスクトップ アプリケーションにそれがないという言い訳はありません。検証するためにボタンを押すのはとても '90 です。
  • 視覚的なフィードバックは重要であり、InputVerifierフォーカスの変更を回避するだけの方法よりも優れています
  • 再利用性の高いコンポーネント。「ユーティリティコードパック」に一連のFormats(日付、倍精度、整数、範囲など)が含まれていることを確認してください。これにより、ほとんどすべての状況を処理できます
  • sの使用により、さまざまなsFormatに対して簡単に調整可能Locale
  • の後に入力を解析する必要はありませんJFormattedTextField。すべての解析コードはフォーマットに含まれており、単純に使用できますJFormattedTextField#getValue
  • すべての検証は によって処理されJFormattedTextFieldます。使用して取得した値がgetValue有効であることを知っている
于 2012-10-21T15:35:12.970 に答える
3

できることはたくさんあります。簡単な方法は、文字列のリストをチェックして int に解析できるようにすることです。追加のチェックについては、数値範囲などの典型的なものをチェックするメソッドがさらに必要です。そのため、各種類のチェックを独自のメソッドに分割し、必要に応じて構成します。

それ以外の場合は、この種のものを処理する完全な検証フレームワークがあります。それらは簡単にグーグルできると思います。

于 2012-10-21T12:33:07.983 に答える
2

を使用してリアルタイムの検証を取得できますDocumentFilter

いくつかの例については、thisおよびthisを確認してください。

JFormattedTextFieldただし、この場合、より適切なソリューションが見つかる可能性があると思います。

于 2012-10-21T19:57:51.260 に答える