package bugs.combobox.fixed.RT21933;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.stage.Stage;
import javafx.util.Callback;
public class ComboDemo extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
ComboBox box = new ComboBox();
RendererListCellFactory cellFactory = new RendererListCellFactory<>(new ToStringRenderer());
box.setCellFactory(cellFactory);
box.getItems().add("The Item");
stage.setScene(new Scene(box));
box.getSelectionModel().select(null);
stage.show();
}
public interface ItemRenderer<T> {
String displayAsString(T t);
String displayPromptText();
}
public class ToStringRenderer implements ItemRenderer {
@Override
public String displayAsString(Object o) {
return o.toString();
}
@Override
public String displayPromptText() {
return "Select";
}
}
public class RendererListCellFactory<T> implements Callback<ListView<T>, ListCell<T>> {
private ItemRenderer<T> renderer;
public RendererListCellFactory(ItemRenderer renderer) {
this.renderer = renderer;
}
@Override
public ListCell<T> call(ListView<T> tListView) {
return new RendererListCell<>(renderer);
}
}
public class RendererListCell<T> extends ListCell<T> {
private ItemRenderer<T> renderer;
public RendererListCell(ItemRenderer<T> renderer) {
this.renderer = renderer;
}
@Override
protected void updateItem(T t, boolean b) {
super.updateItem(t, b);
if (null == t) {
setText(renderer.displayPromptText());
return;
}
setText(renderer.displayAsString(t));
}
}
}