2013-10-21 12 views

Antwort

9

Unten Stück Code für diese Anforderung gearbeitet.

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; 
     } 
    }); 

Die selbe Person-Klasse aus dem Tabellenansichtsbeispiel von Oracle verwendet. Die ursprüngliche Antwort wurde von @James_D im Orakelforum gegeben.

+0

Diese Implementierung hebt die Auswahl aller ausgewählten Elemente auf. Um die Auswahl nur eines Elements aufzuheben, verwenden Sie 'tableView.getSelectionModel(). ClearSelection (index);' – Ravvy

0

Grundsätzlich können Sie als Index nichts ungültiges auswählen. Im allgemeinen wird -1

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

, die die int select nennt. Alternative:

table.getSelectionModel().select(null); 

, die das Objekt select

, wenn Sie den gesamten Code verwendet sehen möchten Anrufe/bestätigen für dieses

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; } 
    } 
} 
+0

Es wäre schön, wenn Sie Ihre Antwort verbessern könnten, indem Sie 'getSelectionModel(). ClearAndSelect (int index)' und implementieren eine "Auswahl auf Klick zum ausgewählten Element abwählen" als OP-Anfragen. –

+0

@thatslch Ich habe deinen Code oben versucht. Die vorher ausgewählte Zeile wird nicht abgewählt, wenn ich erneut darauf klicke. – Dil

+0

@Dil Ich missverstanden Sie Frage: Ich dachte, wie zu klären war dein Problem. – thatsIch

Verwandte Themen