2016-09-02 3 views
0

一部のバックストーリー。私は、テキストフィールドへの入力をフィルタリングするためにテキストフォーマットを使用しています。私は数字だけのために1つ、英数字のためのもの、小数のある数字のためのものを持っています。これは文字のみでなければならず、 "真"または "偽"の大文字と小文字を区別しません。以下のコードでは、入力したい文字だけを入力することができますが、これは必要な機能ですが、順番には一致しません。JavaのTextFormatterを使用して真と偽を照合する方法

UnaryOperator<TextFormatter.Change> filterBoolean = (TextFormatter.Change t) -> { 
         if (t.isReplaced()) { 
          if (t.getText().matches("[^tTrRuUFfAaLlSsEe]")) { 
           t.setText(t.getControlNewText().substring(t.getRangeStart(), t.getRangeEnd())); 
          } 
         } else if (t.isAdded()) { 
          if (t.getText().matches("[^tTrRuUFfAaLlSsEe]")) { 
           t.setText(""); 
          } else if (t.getText().matches("[^tTrRuUFfAaLlSsEe]")) { 
           t.setText(""); 
          } 
         } 
         return t; 
        }; 
getTextField().setTextFormatter(new TextFormatter<>(formatter)); 

私は、各t.getText()ラインに

|| t.getControlNewText().matches("[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]") 
|| t.getControlNewText().matches("[^([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])]") 
|| t.getControlNewText().matches("^([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])") 

を追加し、それらを分離することによって、この機能を使用しようとしましたが、動作するようには思えません。 私は、X文字までの英数字を許可する類似したテキストフォーマッタを持っていますが、それは敏感ではありません。

私の質問は、 "true"と "False"、大文字と小文字を区別しないテキストフィールドの入力敏感な入力を可能にするためにコードを編集するにはどうすればいいですか?

+3

ほとんど話題にはなりませんが、私はこのためのユースケースを想像するのは難しいです。ユーザーが "true"または "false"を入力することになっている場合、チェックボックス、ラジオボタン、またはトグルボタンを使用するだけではどうですか? –

+1

さて、初心者のためにテキストを小文字にシフトできます。また、 'String'からこれを取得する際に' Boolean.parseBoolean(someString) 'を使うことができないのはなぜか分かりません。 –

+0

テキストフィールドはエディタに動的に追加されていますが、これは良い考えです。 –

答えて

2

コメントに記載されているように、チェックボックスや他の種類の切り替えボタンなど、これに対して異なるコントロールを使用することをほぼ確実に考慮する必要があります。

の間に、ユーザーがまだ編集中の(編集が完了したときだけではない)が有効であると考える必要があります。したがって、たとえばユーザーはテキスト"true"または"false"の任意の位置から削除する可能性があります。おそらく、"false"を削除する前に、入力を開始すると、"true"と表示される可能性があります。

あなたは少し厳しい(ただし、ユーザーのためにおそらくより迷惑な)になりたいと思った場合、あなたはおそらく

UnaryOperator<TextFormatter.Change> filterBoolean = (TextFormatter.Change t) -> { 
    String testText = t.getControlNewText().toLowerCase(); 
    if ("truefalse".contains(testText) || "falsetrue".contains(testText)) { 
     return t ; 
    } 
    // otherwise veto: 
    return null ; 
}; 

ような何かをしたいので、あなただけのif ("true".contains(testText) || "false".contains(testText))を行うことができ、などあなたも、より洗練された可能性があり、例えばすべて削除操作があれば(それはユーザーの意図である可能性が高いため)、テキストを削除することができます。

どちらの場合でも、ユーザーがコミットするときには、追加の検証が必要です(おそらくを入力してを入力するか、キーボードフォーカスが失われたとき)。

また、このユースケース用に特別に設計されたコントロールを使用するだけで、はるかに優れたユーザーエクスペリエンスを実現できます。

+0

これはまさに私が必要とすることです。私はまだこれで新しいです、ありがとう! –

関連する問題