Ich möchte mir gerne die selektierten (multiple selection) Items einer JavaFX-Table ausgeben lassen.
Dies mache ich per System.out.println(table.getSelectionModel().getSelectedItems());
Gehen wir mal davon aus in meiner Tabelle stehen 4 Items: a,b,c,d.
Jetzt wähle ich die ersten beiden aus. --> Ausgabe: [a,b] --> soweit alles gut.
Wähle ich jetzt die nächsten beiden aus. --> Ausgabe: [null,c] --> falsch, wollte [c,d] haben, die habe ich ja schließlich auch ausgewählt.
Wenn ich noch ein paar mal 2 der 4 Items auswähle geht es irgendwann wieder... dann wieder nicht...
Also es ist auf jeden Fall ein Problem der TableView...
Ich kann das gleiche Verhalten nämlich auch bei einer anderen Table in einem anderen Fenster der Applikation feststellen... auch dort gibt er bei der zweiten Selektion [null, item] aus wenn ich 2 items selektiere...
P.s.: Während die ListView übrigens korrekt arbeitet (!). Die gibt bei der ersten Selektion [a,b] aus und bei der zweiten Selektion [c,d]. Da funktioniert alles, bei der Table nicht...
(Indem ich das kleine Beispiel mal in meine große Anwendung reinkopiert habe -> danach ging es dort auch nicht mehr!)
Also habe ich mal im Build Path geguckt und folgenden Unterschied bemerkt:
Meine große Anwendung lief mit dem JDK 1.8.0_60.
Das kleine Beispiel unter JRE 1.8.
Also habe ich den Fehler im neuesten JDK vermutet und das 1.8.0_60 mal gegen das JDK 1.8.0_51 getauscht.
Und siehe da: Der Fehler ist weg.
Ich habe dann auch die Rückwärtskontrolle gemacht und mein kleines Beispiel unter dem JDK 1.8.0_60 laufen lassen und: Der Fehler war auch in meinem kleinen Beispiel vorhanden !!
Ziehe ich daraus jetzt den richtigen Schluss, dass das ein Bug im neuesten JDK ist ?!
package application;importjava.net.URL;importjava.util.ResourceBundle;importjavafx.collections.FXCollections;importjavafx.collections.ObservableList;importjavafx.fxml.FXML;importjavafx.scene.control.Button;importjavafx.scene.control.SelectionMode;importjavafx.scene.control.TableColumn;importjavafx.scene.control.TableView;importjavafx.scene.control.cell.PropertyValueFactory;importjavafx.scene.layout.AnchorPane;publicclassFrame{privateObservableList<Item> data =FXCollections.observableArrayList();@FXMLprivateResourceBundle resources;@FXMLprivateURL location;@FXMLprivateAnchorPane pane;@FXMLprivateTableView<Item> table;@FXMLprivateTableColumn<Item,String> table_c1;@FXMLprivateButton button1;@FXMLvoidinitialize(){assert pane !=null:"fx:id=\"pane\" was not injected: check your FXML file 'Frame.fxml'.";assert table !=null:"fx:id=\"table\" was not injected: check your FXML file 'Frame.fxml'.";assert table_c1 !=null:"fx:id=\"table_c1\" was not injected: check your FXML file 'Frame.fxml'.";assert button1 !=null:"fx:id=\"button1\" was not injected: check your FXML file 'Frame.fxml'.";
table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
table_c1.setCellValueFactory(newPropertyValueFactory<Item,String>("name"));
table.getItems().setAll(createData());
button1.setOnAction(e ->{System.out.println(table.getSelectionModel().getSelectedItems());});}privateObservableList<Item>createData(){
data.add(newItem("a"));
data.add(newItem("b"));
data.add(newItem("c"));
data.add(newItem("d"));
data.add(newItem("e"));
data.add(newItem("f"));
data.add(newItem("g"));
data.add(newItem("h"));return data;}}