如何在javaFX中第二次单击/选择时取消选择所选的表行

时间:2013-10-21 09:35:28

标签: javafx-2 javafx-8

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

2 个答案:

答案 0 :(得分:11)

下面的代码符合此要求。

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的论坛中给出。

答案 1 :(得分: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; }
    }
}