6

在我的 JavaFX 表上,当我单击一行时,它会选择该行。现在,当我第二次单击先前选择的同一行时,我想取消选择该特定行。是否可以 ?如果可能,请分享一些示例代码。

4

2 回答 2

12

下面的代码适用于此要求。

tableView.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {  
        @Override  
        public TableRow<Person> call(TableView<Person> tableView2) {  
            final TableRow<Person> row = new TableRow<>();  
            row.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {  
                @Override  
                public void handle(MouseEvent event) {  
                    final int index = row.getIndex();  
                    if (index >= 0 && index < tableView.getItems().size() && tableView.getSelectionModel().isSelected(index)  ) {
                        tableView.getSelectionModel().clearSelection();
                        event.consume();  
                    }  
                }  
            });  
            return row;  
        }  
    });  

使用了 oracle 的表视图示例中的相同 Person 类。@James_D 在 oracle 的论坛中给出了原始答案。

于 2013-10-21T19:47:35.647 回答
0

基本上你可以选择任何无效的作为索引。一般-1是首选

table.getSelectionModel().select(-1);

它调用 int select。选择:

table.getSelectionModel().select(null);

调用对象select

如果您想查看为此使用/确认的整个代码

public class Main extends Application {
    @SuppressWarnings("unchecked")
    @Override
    public void start(Stage stage) {        
        Scene scene = new Scene(new Group());
        TableView<Person> table = new TableView<Person>();
        stage.setTitle("Table View Sample");
        stage.setWidth(300);
        stage.setHeight(500);

        final Label label = new Label("Address Book");
        label.setFont(new Font("Arial", 20));

        table.setEditable(true);

        TableColumn<Person, String> firstNameCol = new TableColumn<Person, String>("Test Name");
        firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name"));

        table.getColumns().addAll(firstNameCol);

        final VBox vbox = new VBox();
        vbox.setSpacing(5);
        vbox.setPadding(new Insets(10, 0, 0, 10));
        vbox.getChildren().addAll(label, table);

        table.itemsProperty().get().add(new Person("Hans"));
        table.itemsProperty().get().add(new Person("Dieter"));

        ((Group) scene.getRoot()).getChildren().addAll(vbox);

        table.getSelectionModel().select(-1);

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    public class Person {
        final StringProperty name = new SimpleStringProperty();

        Person(String name) {
            this.name.set(name);
        }

        public StringProperty nameProperty() { return this.name; }
    }
}
于 2013-10-21T11:41:13.063 回答