2016-06-24 2 views
1

Я искал немного, но не смог найти ответа. Комбобокс доступен для редактирования. Как я могу показать другой текст в тексте приглашения Combobox и в списке объектов ниже? В списке я хочу использовать метод toString для объекта, но когда я его выбираю, я хочу, чтобы в тексте приглашения отображался только один атрибут выбранного объекта.JavaFX ComboBox - Как получить различный текст запроса и выделенный текст?

Как это сделать? Можно ли отображать значение объекта по-разному в текстовом поле приглашения и в списке ниже?

Примером использования будет использование песен. Скажем, я ищу песню по названию, затем она показывает мне песню с названием, композитором и инструментом ниже. Когда я выбираю песню, я хочу, чтобы заголовок отображался в тексте приглашения (потому что я показываю информацию о композиторе и инструменте где-то в другом месте).

+0

Хотите ли вы использовать текстовое поле для редактирования ComboBox для фильтрации результатов, отображается в выпадающем меню? – DVarga

+0

Обратите внимание, что текст приглашения является отображаемым текстом, если элемент не выбран и, следовательно, не зависит от метода 'toString' ваших элементов. Скорее всего, это что-то вроде 'Пожалуйста, выберите элемент', а не результат' toString' для элемента ... Интерпретировал его как «текст, отображаемый в TextField» в моем ответе ниже. Если это неправильная интерпретация, скажите мне в комментарии ... – fabian

ответ

1

Используйте converter, который использует короткую версию для преобразования и пользовательского cellFactory для создания клеток, отображающих расширенную версию:

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(); 
} 
Смежные вопросы