package bugs.combobox; import com.sun.javafx.collections.ObservableListWrapper; import javafx.application.Application; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableValue; import javafx.scene.Scene; import javafx.scene.control.ComboBox; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.FlowPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import javafx.util.Callback; import java.util.ArrayList; import java.util.List; public class ClickOnButtonCellOfComboBoxWhileSceneHasNoFocusCausesButtonCellAreaToFlicker extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { BorderPane pane = new BorderPane(); VBox left = new VBox(); left.getChildren().addAll(createFilterBox("threads"), createFilterBox("LogLevel")); pane.setLeft(left); TableView<String> table = new TableView<>(); table.getColumns().add(createColumn("one")); table.getColumns().add(createColumn("two")); table.setItems(new ObservableListWrapper<String>(createItems())); pane.setCenter(table); stage.setScene(new Scene(pane)); stage.show(); } private VBox createFilterBox(String promptText) { VBox filterBox = new VBox(); ComboBox<String> comboBox = new ComboBox<>(); comboBox.setPromptText(promptText); filterBox.setMaxWidth(250); filterBox.getChildren().add(comboBox); filterBox.getChildren().add(new FlowPane()); comboBox.setItems(new ObservableListWrapper<>(createItems())); return filterBox; } private TableColumn<String, String> createColumn(String name) { TableColumn<String, String> column = new TableColumn<>(name); column.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<String, String>, ObservableValue<String>>() { @Override public ObservableValue<String> call(TableColumn.CellDataFeatures<String, String> stringStringCellDataFeatures) { return new SimpleObjectProperty<>(stringStringCellDataFeatures.getValue()); } }); column.setCellFactory(new Callback<TableColumn<String, String>, TableCell<String, String>>() { @Override public TableCell<String, String> call(TableColumn<String, String> stringStringTableColumn) { return new TableCell<String, String>(){ @Override protected void updateItem(String s, boolean b) { super.updateItem(s, b); if(null == s){ setText("null"); return; } setText(s); } }; } }); return column; } private List<String> createItems() { List<String> items = new ArrayList<>(); for(int index=0; index<1000; ++index){ items.add("item " + String.format("%03d with some really long text in it at least that was the case in the real application", index)); } return items; } }