ProgressBarTableCell, Focus-Problem beheben
In JavaFX 8 wird der Focus beim Anklicken der ProgressBarTableCell leider nicht an die Tabellenzeile weitergegeben.
Dies kann mit folgender Klasse (ein erweiterte Kopie von ProgressBarTableCell) behoben werden:
package com.sowas.javawiki; import javafx.beans.value.ObservableValue; import javafx.scene.control.ProgressBar; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableRow; import javafx.util.Callback; public class ProgressBarTableCellExt<S> extends TableCell<S, Double> { private final ProgressBar progressBar; private ObservableValue<Double> observable; /** * Erzeugt eine Tabellenzelle welche einen Wert zwischen 0.0 und 1.0 als Progressbar darstellt. */ public static <S> Callback<TableColumn<S,Double>, TableCell<S,Double>> forTableColumn() { return param -> new ProgressBarTableCellExt<S>(); } public ProgressBarTableCellExt() { this.getStyleClass().add("progress-bar-table-cell"); progressBar = new ProgressBar(); progressBar.setMaxWidth(Double.MAX_VALUE); // Hier sorft der Mouse-Klick für das Setzen des Focus auf die Tabellenzeile: progressBar.setOnMouseClicked(event -> { TableRow tableRow = getTableRow(); tableRow.getTableView().requestFocus(); tableRow.getTableView().getSelectionModel().focus(tableRow.getIndex()); tableRow.getTableView().getSelectionModel().select(tableRow.getIndex()); }); } @Override public void updateItem(Double item, boolean empty) { super.updateItem(item, empty); if (empty) { setGraphic(null); } else { progressBar.progressProperty().unbind(); final TableColumn<S,Double> column = getTableColumn(); observable = column == null ? null : column.getCellObservableValue(getIndex()); if (observable != null) { progressBar.progressProperty().bind(observable); } else if (item != null) { progressBar.setProgress(item); } setGraphic(progressBar); } } }
Stichworte:
JavaFX, ProgressBarTableCell, Focus, Problem