ProblemWie Sie sich richtig um neue Daten zu Tableview hinzufügen und navigieren Sie zu dem
Ich mag eine Tableview dynamisch Daten hinzufügen und auf die neuen Daten der Position zu bewegen. Aber wenn die Zeilen im Tableview die die Anzeigengröße erreichen, bekomme ich diese in der Konsole:
18. April 2015 09.14.34 com.sun.javafx.scene.control.skin.VirtualFlow addTrailingCells INFO: Index überschreitet maxCellCount. Prüfen Größe Berechnungen für die Klasse javafx.scene.control.TableRow
Also tat ich denke, ich etwas falsch gemacht. Alles, was ich tat, wurde mit der Oracle Tableview Beispiel und fügen Sie diese:
// button to add new data
Button bt = new Button("Add");
bt.setOnAction(e -> {
// insert new item
int i = data.size() + 1;
Person person = new Person("Name " + i, "Name " + i, "Mail " + i);
data.add(person);
// scroll to new item
table.scrollTo(person);
});
Das gleiche passiert, wenn Sie
verwendentable.getItems().add(person);
stattdessen die Liste der zu modifizieren.
Der Schuldige ist die ScrollTo-Methode. Die gleichen Informationen/Fehler treten auf, wenn Sie den Zeilenindex mit der Methode scrollTo verwenden.
Frage
Wie fügen Sie neue Objekte korrekt zu einem Tableview, so dass die Informationen/Fehler nicht angezeigt wird?
-Code
Hier ist ein vollständiges Beispiel. Der Tisch ist bereits ausgefüllt. Wenn Sie auf die Schaltfläche Hinzufügen klicken, wird die Größe des Darstellungsbereichs erreicht und die Info (oder der Fehler?) Wird in der Konsole angezeigt.
public class TableViewSample extends Application {
private TableView<Person> table = new TableView<Person>();
private final ObservableList<Person> data = FXCollections.observableArrayList();
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(450);
stage.setHeight(500);
table.setEditable(true);
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setMinWidth(100);
lastNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("lastName"));
TableColumn emailCol = new TableColumn("Email");
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("email"));
table.setItems(data);
table.getColumns().addAll(firstNameCol, lastNameCol, emailCol);
// -------------------------------
// dynamically add data
// -------------------------------
// fill table with data
for(int i=0; i < 14; i++) {
Person person = new Person("Name " + i, "Name " + i, "Mail " + i);
data.add(person);
}
// button to add new data
Button bt = new Button("Add");
bt.setOnAction(e -> {
// insert new item
int i = data.size() + 1;
Person person = new Person("Name " + i, "Name " + i, "Mail " + i);
data.add(person);
// scroll to new item
table.scrollTo(person);
});
// -------------------------------
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.getChildren().addAll(table, bt);
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
public String getLastName() {
return lastName.get();
}
public void setLastName(String fName) {
lastName.set(fName);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
}
Haben Sie immer auf dem Boden des 'TableView' blättern wollen? – ItachiUchiha
Nein, es kann Fälle geben, in denen die neue Zeile nicht unten ist. Beispiel: Der Fokus befindet sich in Zeile 5, der Benutzer scrollt in Zeile 100 nach unten. Zeile 5 ist nicht sichtbar. Benutzer drückt "Einfügen" -Taste. Zeile sollte an Position 6 hinzugefügt werden und die Tabelle sollte zu dieser neuen Zeile gescrollt werden. – Roland
Scheint wie ein Fehler für mich, da dies nur passiert, solange das 'TableView' keine' ScrollBars' enthält. – eckig