SimpleStringProperty et SimpleIntegerProperty TableView JavaFX

donc j'essaie d'apprendre à utiliser JavaFx Tableview et j'ai trébuché sur ce tutoriel:

Oracle tableview tutorial

dans ce tutoriel ils montrent que pour vous remplir tableView vous devez le remplir avec des chaînes, mais pas n'importe quelle chaîne vous devez vous formater String à un SimpleStringProperty

j'ai essayé sans le format et le résultat était qu'aucune des informations ne serait spectacle!

j'ai Également découvert que si vous souhaitez ajouter un Integer à la table, vous devez le déclarer comme un SimpleIntegerProperty

maintenant je suis assez nouveau à JavaFx mais cela signifie-t-il que lorsque je crée un objet je dois formater tous mes entiers et chaînes pour pouvoir remplir mon TableView? il semble plutôt stupide, mais peut-être qu'il est un but plus élevé? ou est-il un moyen de l'éviter?

8
demandé sur Marc Rasmussen 2012-11-14 18:45:36

1 réponses

vous n'avez pas besoin d'utiliser des propriétés dans vos objets de données de table pour les afficher, bien que l'utilisation de propriétés dans certaines circonstances est souhaitable.

le code suivant affichera une table de personnes basée sur une classe de personnes qui n'a que des Champs de chaîne.

import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class ReadOnlyTableView extends Application {
  private TableView<Person> table = new TableView<Person>();
  private final ObservableList<Person> data =
    FXCollections.observableArrayList(
      new Person("Jacob", "Smith", "jacob.smith@example.com"),
      new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
      new Person("Ethan", "Williams", "ethan.williams@example.com"),
      new Person("Emma", "Jones", "emma.jones@example.com"),
      new Person("Michael", "Brown", "michael.brown@example.com")
    );

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

  @Override public void start(Stage stage) {
    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(500);

    final Label label = new Label("Address Book");
    label.setFont(new Font("Arial", 20));

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

    final VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label, table);

    stage.setScene(new Scene(new Group(vbox)));
    stage.show();
  }

  public static class Person {
    private String firstName;
    private String lastName;
    private String email;

    private Person(String fName, String lName, String email) {
      this.firstName = fName;
      this.lastName = lName;
      this.email = email;
    }

    public String getFirstName() { return firstName; }
    public void setFirstName(String fName) { firstName = fName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lName) { lastName = lName; }
    public String getEmail() { return email; }
    public void setEmail(String inMail) { email = inMail; }
  }
}

explication

le but de L'utilisation des propriétés et des listes observables est qu'il s'agit d'éléments lisibles. Lorsque les propriétés sont utilisées, si la valeur d'un attribut de propriété dans le datamodel change, la vue de l'élément dans le TableView est automatiquement mise à jour pour correspondre à la valeur de datamodel mise à jour. Par exemple, si la valeur de la propriété email d'une personne est définie à une nouvelle valeur, cette mise à jour sera reflétée dans le TableView parce qu'il écoute le changement de propriété. Si à la place, une chaîne simple avait été utilisée pour représenter l'email, TableView ne se rafraîchirait pas car il ne serait pas conscient de la valeur de l'email changement.

la PropertyValueFactory la documentation décrit ce processus en détail:

Un exemple d'utilisation de cette classe est:

TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));  

dans cet exemple, la chaîne "firstName" est utilisée comme une référence à un la méthode premiernameproperty() dans le type de classe de personne (qui est le type de classe de la liste des éléments TableView). En outre, cette méthode doit retourner une Exemple de propriété. Si une méthode répond à ces critères les exigences sont trouvées, puis la TableCell est remplie avec ceci ObservableValue. De plus, TableView ajoutera automatiquement un observateur à la valeur retournée, de sorte que tout changement déclenché sera observé par le TableView, ce qui entraîne la mise à jour immédiate de la cellule.

S'il n'existe pas de méthode correspondant à ce modèle, il y a erreur soutien pour tenter d'appel de get() ou() (qui is, getFirstName() ou isFirstName() dans l'exemple ci-dessus). Si une méthode correspondant à ce modèle existe, la valeur retournée par cette méthode est enveloppé dans une pipette à jet et retourné à la cuillère à soupe. Toutefois, dans cette situation, cela signifie que la coquille ne sera pas capable d'observer la valeur observable pour les changements (comme c'est le cas première approche ci-dessus).

mise à Jour

voici un exemple contrasté le premier exemple qui montre comment une vue de table peut observer et rafraîchir automatiquement basé sur des changements à sa liste D'articles observable et des changements à la valeur d'un attribut d'article basé sur la propriété.

import javafx.application.Application;
import javafx.beans.property.*;
import javafx.collections.*;
import javafx.event.*;
import javafx.geometry.Insets;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class PropertyBasedTableView extends Application {
  private TableView<Person> table = new TableView<Person>();
  private final ObservableList<Person> data = FXCollections.observableArrayList();
  private void initData() {
    data.setAll(
      new Person("Jacob", "Smith", "jacob.smith@example.com"),
      new Person("Isabella", "Johnson", "isabella.johnson@example.com"),
      new Person("Ethan", "Williams", "ethan.williams@example.com"),
      new Person("Emma", "Jones", "emma.jones@example.com"),
      new Person("Michael", "Brown", "michael.brown@example.com")
    );
  }

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

  @Override public void start(Stage stage) {
    initData();

    stage.setTitle("Table View Sample");
    stage.setWidth(450);
    stage.setHeight(500);

    final Label label = new Label("Address Book");
    label.setFont(new Font("Arial", 20));

    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);
    table.setPrefHeight(300);

    final Button setEmailButton = new Button("Set first email in table to wizard@frobozz.com");
    setEmailButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        if (data.size() > 0) {
          data.get(0).setEmail("wizard@frobozz.com");
        }  
      }
    });

    final Button removeRowButton = new Button("Remove first row from the table");
    removeRowButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        if (data.size() > 0) {
          data.remove(0);
        }  
      }
    });

    final Button resetButton = new Button("Reset table data");
    resetButton.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        initData();
      }
    });

    final VBox vbox = new VBox(10);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label, table, setEmailButton, removeRowButton, resetButton);

    stage.setScene(new Scene(new Group(vbox)));
    stage.show();
  }

  public static class Person {
    private final StringProperty firstName;
    private final StringProperty lastName;
    private final StringProperty 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 StringProperty firstNameProperty() { return firstName; }
    public String getLastName() { return lastName.get(); }
    public void setLastName(String lName) { lastName.set(lName); }
    public StringProperty lastNameProperty() { return lastName; }
    public String getEmail() { return email.get(); }
    public void setEmail(String inMail) { email.set(inMail); }
    public StringProperty emailProperty() { return email; }  // if this method is commented out then the tableview will not refresh when the email is set.
  }
}
26
répondu jewelsea 2012-11-14 21:46:56