2017-02-24 5 views
1

私はMyEnumタイプの利用可能な値が移入されてみたいComboBoxを持つフォームがあります選択を行うと、例えばボタンを打った後、私が作成したいのですが、その後JavaFXでUIを使用して列挙を表示および作成するベストプラクティスは何ですか?

public enum MyEnum { 
    FIRST_CHOICE ("First choice"), 
    SECOND_CHOICE ("Second choice"); 

    private String value; 

    MyEnum(String value) { 
    this.value = value; 
    } 

    public String toString() { 
    return value; 
    } 
} 

myComboBox.getItems().setAll(MyEnum.values()); 

を新しいMyEnumオブジェクトです。私が思いついたアイデアは、次のとおりです。

オプション1:

とら選択に係る新しいMyEnumを作成し、コンボボックスから値を取得し、switchステートメントを使用して。

オプション2:

が列挙されたもののように文字列値が同じ作りとvalueOf()を使用してMyEnumを作成します。

public enum MyEnum { 
    FIRST_CHOICE ("FIRST_CHOICE"), 
    SECOND_CHOICE ("FIRST_CHOICE"); 

    ... 
} 

MyEnum myEnum = MyEnum.valueOf(myComboBox.getSelectionModel().getSelectedItem()) 

---------

だから最初の選択肢はひどいです、私は知っています。 2番目はやや上手ですが、「FIRST_CHOICE」のようなテキストが表示されるため、ユーザーフレンドリーではありません。より良いオプションがあると思います。可能な限りViewとModelを分離して、可能な限り最良の状態にしたいと思っていますが、私はそれをどのように達成できるのか全く分かりません。

+0

'valueOf'は新しい列挙定数を作成しません。それは既存のものを返します... – fabian

答えて

2

私は「オプション3」を使用して、StringConverterを使用します。これにより、enumの "under the hood"を使用し、より適切なStringをユーザに表示することができます。これにより、さまざまな状況で異なる文字列を使用することもできます。国際化、または同じ基本タイプの上に異なるコンボボックスを作成することができます。ここで私は、ファイルの例として、case文を使用しましたが、プロパティの値を調べることができ

など

ComboBox<MyEnum> myComboBox = new ComboBox<>(); 
myComboBox.getItems().setAll(MyEnum.values()); 
myComboBox.setConverter(new StringConverter<MyEnum>() { 

    @Override 
    public String toString(MyEnum object) { 
     switch (object) { 
     case FIRST_CHOICE: 
      return "foo"; 
     case SECOND_CHOICE: 
      return "bar"; 
     default: 
      break; 
     } 
     return null; 
    } 

    @Override 
    public MyEnum fromString(String string) { 
     return null; 
    } 
}); 

Example

コンボボックスから返された値は、まだ型になりますMyEnum、これは

myComboBox.valueProperty().addListener((obs, oldValue, newValue) -> { 
    System.out.println(myComboBox.getValue()); 
}); 

出力

によって実証することができます
SECOND_CHOICE 
FIRST_CHOICE 
+0

しかし、選択が行われたときに、このオプションを使用して列挙を作成するにはどうすればよいですか?私はまだスイッチを使用する必要があります( '' fromString() ''メソッドに関して) – notmyf4ulty

+0

@ notmyf4ulty myComboBox.getValue();列挙型を返します。文字列コンバーターはUIにのみ使用されています...これを反映するように答えを更新します... – Adam

+0

ああ、今すぐ取得します!ちょうど '' ''に気付かなかった。素晴らしい答え、ありがとう。 – notmyf4ulty

関連する問題