2015-04-18 14 views
8

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

verwenden
table.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); 
     } 
    } 
} 
+0

Haben Sie immer auf dem Boden des 'TableView' blättern wollen? – ItachiUchiha

+0

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

+0

Scheint wie ein Fehler für mich, da dies nur passiert, solange das 'TableView' keine' ScrollBars' enthält. – eckig

Antwort

1

Ich hatte diese Warnung vor aber Sie müssen keine Sorge darüber, wie beause here erwähnt:

Dies geschieht, wenn die maximale Anzahl der Zellen, die jemals in der Lage sein sollte, um in das Ansichtsfenster zu passen, wenn jede Zelle eine Höhe von 1 hätte. Wenn der Index diese Anzahl überschreitet, wird der Offset nicht schnell genug erhöht, oder überhaupt nicht, was bedeutet, dass mit der Größenberechnung der Zelle etwas nicht stimmt (in Zeile 2.48:)

Dies könnte von uns verursacht werden, weil wir bewegen schneller als der durchschnittliche Benutzer oder andere Dinge in der RC-Code und in Ihrem Beispieltable.scrollTo(person); tun blättern noch schneller speziell, wenn Sie viel Reihen hatten.

+5

Wenn Sie ein Produkt verkaufen und die Benutzer das in ihrer Konsole sehen, werden sie verdächtig. Es zu ignorieren ist also keine Option. – Roland

+1

Das ist richtig, vielleicht und wir hoffen, dass sie in den zukünftigen Updates damit umgehen. Aber ich verstehe nicht, wie ein Benutzer es (die Warnung) sehen kann, wenn Sie ihm Ihren Code geben !? Sonst beeinflusst es technisch nicht die Leistung. Deshalb habe ich mich entschieden, es zu vergessen und auf das Update zu warten. –

+0

Jeder Benutzer kann die Protokollierungsinformationen über die Java-Konsole anzeigen, die in der Java-Systemsteuerung aktiviert werden kann. – Roland

-1

Ich finde keine Lösung, aber das Problem ist nicht über scrollTo() -Methode, es ist immer passieren, wenn Sie nach unten scrollen (auch manuell) und erhöhen Sie die Fensterhöhe, wenn die Rolle verschwinden ich weiß nicht, warum brauchen ein Bug Ticket

+0

Dies wird zum Ende der Liste blättern. Das ursprüngliche Problem bestand darin, zu einer bestimmten Zeile zu blättern. –

1

Unterdrückt durch Zurücksetzen des Log-Manager um die Warnung zu öffnen:

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.*; 
import javafx.scene.layout.*; 
import javafx.beans.property.*; 
import javafx.collections.*; 

import java.util.logging.LogManager; 

public class TableViewSample extends Application { 
    // ... setup ... 

    public static void main(String[] args) { 

    // Suppress the warning message when the Add button is clicked. 
    LogManager.getLogManager().reset(); 

    launch(args); 
    } 

Dies wird die gesamte Anwendung des Loggers beeinflussen. Wenn dies nicht gewünscht ist, ändern Sie den Protokolliergrad für die betreffende Klasse (com.sun.javafx.scene.control.skin.VirtualFlow) in Level.OFF. auch

Siehe:

Da dies eine Warnung ist, kann es wahrscheinlich ignoriert werden, und daher unterdrückt. Soweit ich das beurteilen kann, wird die neue Zeile erfolgreich hinzugefügt. Hier ist der säumige Code, der in überprüft wurde, die, IMO, das Prinzip der geringsten Erstaunen verletzt:

Verwandte Themen