2015-06-15 9 views
7

Ich habe eine TableView in SelectionMode.MULTIPLE. Mit einem ListChangeListener kann ich die Auswahl mehrerer Zeilen (durch Drücken von Shift) fangen.
SelectedItems leer, wenn mehrere Zeilen mit verschiedenen Spalten ausgewählt wurden

Meine Lösung funktioniert jedoch nur, wenn die Artikel in der gleichen Spalte OR im Bereich ohne Spalten ausgewählt werden. Gif Illustration mit 4 Beispiele:

  1. OK: Auswahl 3 Artikel Verschiebung in Spalte State
  2. OK mit: Auswahl 4 Elemente mit Shift- in Idx Spalte
  3. OK: Auswählen von 4 Elementen unter Verwendung von Shift von State-Spalte zu Bereich ohne Spalten
  4. Fehler: Versuch 4 Elemente auszuwählen, mit Shift- ausgehend von Staat Spalt Datenelement Spalte

Selection of multiple items in different columns

Das Problem scheint zu sein, dass die SelectedItems -Liste im letzten Beispiel scheinbar leer sind . Ich würde Ihre Hilfe in Bezug auf dieses Problem sehr zu schätzen wissen.

Hier ist mein Ansatz:

ObservableList<DataRowModel> dataRows = FXCollections.observableArrayList(); 
dataRows.addAll(dataSetModel.getRows()); 
tableDataRow.setItems(dataRows); 
tableDataRowStateColumn.setCellValueFactory(f -> f.getValue().getState()); 

tableDataRow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
tableDataRow.getSelectionModel().getSelectedItems() 
.addListener((ListChangeListener.Change<? extends DataRowModel> c) -> { 
    while (c.next()) { 
     c.getRemoved().stream().forEach(remitem -> remitem.setSelected(false)); 
     c.getAddedSubList().stream().forEach(additem -> additem.setSelected(true)); 
     System.out.println(c.getList()); //Empty [] when selected using different columns 
    } 
}); 

nur für ein besseres Verständnis von meinem Code: setSelected(...) ein BooleanProperty auf meinem DataRowModel setzt, die an den Staat-Säule gebunden ist.

Ohne Kontext scheint der Grund für die Verwendung dieser ausgewählten Eigenschaft ziemlich albern zu sein. Es gibt jedoch verschiedene andere Code-Fragmente mit ChangeListenern, die an die ausgewählte Eigenschaft gebunden sind.

SSCCE bereit zu laufen:

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ListChangeListener; 
import javafx.collections.ObservableList; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class TableViewSample extends Application { 

    private TableView<DataRowModel> tableDataRow = new TableView<DataRowModel>(); 
    private TableColumn<DataRowModel, String> tableDataRowNameColumn = new TableColumn<>("Data Item"); 
    private TableColumn<DataRowModel, String> tableDataRowStateColumn = new TableColumn<>("State"); 

    private final ObservableList<DataRowModel> dataRows = 
     FXCollections.observableArrayList(
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false) 
     ); 

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

    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(500); 
     stage.setHeight(500); 

     tableDataRow.setItems(dataRows); 
     tableDataRowNameColumn.setCellValueFactory(f -> f.getValue().getName()); 
     tableDataRowStateColumn.setCellValueFactory(f -> f.getValue().getState()); 

     tableDataRow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
     tableDataRow.getSelectionModel().getSelectedItems() 
      .addListener((ListChangeListener.Change<? extends DataRowModel> c) -> { 
      while (c.next()) { 
       c.getRemoved().stream().forEach(remitem -> remitem.setSelected(false));  
       c.getAddedSubList().stream().forEach(additem -> additem.setSelected(true));     
      } 
     }); 

     tableDataRow.getColumns().addAll(tableDataRowNameColumn, tableDataRowStateColumn); 

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

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

    public static class DataRowModel { 
     private StringProperty name = new SimpleStringProperty(this, "name", ""); 
     private BooleanProperty selected = new SimpleBooleanProperty(this, "selected", true); 
     private StringProperty state = new SimpleStringProperty(this, "state", ""); 

     public DataRowModel(String name, boolean selected) { 
      this.name.setValue(name); 
      this.selected.setValue(selected); 

      this.selected.addListener((observable, oldVal, newVal) -> { 
       getState(); // Refresh State value 
      }); 
     } 

     public StringProperty getName() { 
      return name; 
     } 
     public BooleanProperty isSelected() { 
      return selected; 
     } 
     public void setSelected(boolean selected) { 
      if (this.selected.getValue() != selected) 
       this.selected.setValue(selected); 
     } 

     public StringProperty getState() { 
      String stateStr = ""; 
      if (selected.getValue()) 
       stateStr += "Selected"; 
      state.setValue(stateStr); 
      return state; 
     } 
    } 
} 
+3

im August veröffentlicht werden sollte, während das Bild ist schön - besser wäre ein SSCCE sein, die das Problem veranschaulicht: -) – kleopatra

+0

Hinzugefügt - einige unnötige Dinge im SSCCE entfernt, um den JavaFX-Code so kompakt wie möglich zu bekommen :) – Luke

+4

Ich konnte dies erzeugen, indem ich das Oracle-Beispiel für die Tabellenansicht von Oracle änderte. Dieser Fehler wird als https://bugs.openjdk.java.net/browse/JDK-8096787 abgelegt und in 8u60 behoben. –

Antwort

2

Ich konnte dies erzeugen, durch das Beispiel Person Tableview Oracle bearbeiten.

Dies ist ein Fehler, wie https://bugs.openjdk.java.net/browse/JDK-8096787 eingereicht, und in Version 8u60 befestigt, die 2015

+0

@kleopatra du bist willkommen! –

Verwandte Themen