2016-06-24 12 views
1

少し検索しましたが、回答が見つかりませんでした。 Comboboxは編集可能です。 Comboboxのプロンプトテキストと下のオブジェクトのリストに異なるテキストを表示するにはどうすればよいですか?リストでは、使用するObjectのtoStringメソッドが必要ですが、選択すると、選択したObjectの1つの属性だけがプロンプトテキストに表示されます。JavaFX ComboBox - 異なるプロンプトテキストと選択したアイテムテキストを取得する方法

どうすればいいですか?プロンプトテキストフィールドと下のリストにオブジェクトの値を別々に表示することはできますか?

例としては曲があります。曲をタイトルで検索した場合、下のタイトル、作曲家、楽器の曲が表示されます。私が曲を選んだときは、プロンプトのテキストにタイトルを表示したいだけです(私は作曲家と楽器の情報を別の場所に表示するためです)。

+0

をドロップダウンに表示されますか? – DVarga

+0

プロンプトテキストは、アイテムが選択されておらず、アイテムの 'toString'メソッドから独立している場合に表示されるテキストであることに注意してください。これは、アイテムの 'toString'結果ではなく、'アイテムを選択してください 'のようなものでしょう...私の答えは、 "TextFieldに表示されるテキスト"と解釈されます。それが間違った解釈であれば、コメントで教えてください... – fabian

答えて

1

変換と拡張版示す細胞を作成するためのカスタムcellFactoryのためのショートバージョンを使用していますconverter使用する:あなたはその結果をフィルタリングするために編集可能なコンボボックスのテキストフィールドを使用しますか

static class Item { 
    private final String full, part; 

    public Item(String full, String part) { 
     this.full = full; 
     this.part = part; 
    } 

    public String getFull() { 
     return full; 
    } 

    public String getPart() { 
     return part; 
    } 

} 

@Override 
public void start(Stage primaryStage) { 
    ComboBox<Item> comboBox = new ComboBox<>(FXCollections.observableArrayList(
      new Item("AB", "A"), 
      new Item("CD", "C") 
    )); 

    comboBox.setEditable(true); 

    // use short text in textfield 
    comboBox.setConverter(new StringConverter<Item>(){ 

     @Override 
     public String toString(Item object) { 
      return object == null ? null : object.getPart(); 
     } 

     @Override 
     public Item fromString(String string) { 
      return comboBox.getItems().stream().filter(i -> i.getPart().equals(string)).findAny().orElse(null); 
     } 

    }); 

    comboBox.setCellFactory(lv -> new ListCell<Item>() { 

     @Override 
     protected void updateItem(Item item, boolean empty) { 
      super.updateItem(item, empty); 

      // use full text in list cell (list popup) 
      setText(item == null ? null : item.getFull()); 
     } 

    }); 

    Scene scene = new Scene(comboBox); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
関連する問題