使JavaFX TableView行无法选择和NoFocusTraversable

我试图使JavaFX行无法选择, NoFocusTraversable但我没有运气这样做。 下面是您可以用来玩它的另一个问题的代码。 我添加了两个自定义行,使某些行no focus traversable

虽然我不能让某些行无法unselectable ,但任何想法?


您需要下载TomasMikula / EasyBind库(或注释上面的行并取消注释RowFactory

代码来自( JavaFX:如何禁用TableView中的行? )StackOverflow答案:

 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; import java.util.function.Function; import javafx.application.Application; import javafx.beans.binding.Bindings; import javafx.beans.property.IntegerProperty; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.ContentDisplay; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableRow; import javafx.scene.control.TableView; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; import org.fxmisc.easybind.EasyBind; public class DisabledTableRowExample extends Application { @Override public void start(Stage primaryStage) { TableView table = new TableView(); table.getItems().addAll(createData()); TableColumn deleteCol = createTableColumn("Delete", ReadOnlyObjectWrapper::new); deleteCol.setCellFactory(this::createDeleteCell); table.getColumns().addAll(Arrays.asList( createTableColumn("Name", Item::nameProperty), createTableColumn("Value", Item::valueProperty), deleteCol )); // A row factory that returns a row that disables itself whenever the // item it displays has a value less than 5: table.setRowFactory(tv -> { TableRow row = new TableRow(); // use EasyBind to access the valueProperty of the itemProperty of the cell: row.disableProperty().bind( EasyBind.select(row.itemProperty()) // start at itemProperty of row .selectObject(Item::valueProperty) // map to valueProperty of item, if item non-null .map(x -> x.intValue() < 5) // map to BooleanBinding via intValue of value < 5 .orElse(false)); // value to use if item was null row.setFocusTraversable(false); //here row.setEditable(false); //here // it's also possible to do this with the standard API, but there are lots of // superfluous warnings sent to standard out: // row.disableProperty().bind( // Bindings.selectInteger(row.itemProperty(), "value") // .lessThan(5)); return row ; }); BorderPane root = new BorderPane(table); Scene scene = new Scene(root, 600, 400); primaryStage.setScene(scene); primaryStage.show(); } private List createData() { Random rng = new Random(); List data = new ArrayList(); for (int i=1; i<=20; i++) { data.add(new Item("Item "+i, rng.nextInt(10))); } return data ; } private  TableColumn createTableColumn(String name, Function<S, ObservableValue> propertyMapper) { TableColumn col = new TableColumn(name); col.setCellValueFactory(cellData -> propertyMapper.apply(cellData.getValue())); return col ; } private TableCell createDeleteCell(TableColumn col) { ObservableList itemList = col.getTableView().getItems(); TableCell cell = new TableCell(); cell.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); Button button = new Button("Delete"); button.setOnAction(event -> itemList.remove(cell.getItem())); cell.graphicProperty().bind(Bindings.when(cell.emptyProperty()).then((Node)null).otherwise(button)); return cell ; } /** * Item class here */ public static class Item { private final StringProperty name = new SimpleStringProperty(this, "name"); private final IntegerProperty value = new SimpleIntegerProperty(this, "value"); public final StringProperty nameProperty() { return this.name; } public final java.lang.String getName() { return this.nameProperty().get(); } public final void setName(final java.lang.String name) { this.nameProperty().set(name); } public final IntegerProperty valueProperty() { return this.value; } public final int getValue() { return this.valueProperty().get(); } public final void setValue(final int value) { this.valueProperty().set(value); } public Item(String name, int value) { setName(name); setValue(value); } } public static void main(String[] args) { launch(args); } }