2012-11-14 26 views
8

Yani JavaFX Tableview nasıl kullanılacağını öğrenmeye çalışıyorum ve ben bu öğretici genelinde stumpled:SimpleStringProperty ve SimpleIntegerProperty TableView JavaFX

Oracle tableview tutorial

Bu eğitimde size tableView doldurmak için Mecbur olduğunu göstermektedir dizeleri ile doldurun, ancak herhangi bir dize değil String için bir SimpleStringProperty

biçimlendirmek zorunda kaldım ve sonuç hiçbir bilgi gösterilmemiştir!

Ayrıca sana tabloya bir Integer eklemek istiyorsanız JavaFX için Şimdi ben oldukça yeni bir SimpleIntegerProperty

olarak ilan etmek olurdu buldum ama bu ı bir nesne oluşturduğunuzda ben gerektiği anlamına gelmez TableView'ımı doldurabilmek için bütün Tamsayılarımı ve Dizelerimı biçimlendirmek için? oldukça aptalca görünüyor ama belki daha yüksek bir amaç var mı? ya da bundan kaçınmanın bir yolu var mı?

+0

Kötü yazılmış bir öğretici. Çok önemli noktalar üzerinde parlaklaşırlar, örneğin Generics. –

cevap

23

Bazı durumlarda, özelliklerin belirli durumlarda kullanılması istenebilse de, tablo veri nesnelerinizde görüntülenmeleri için Özellikler'i kullanmanız gerekmez.

Aşağıdaki kod, yalnızca Dize alanlarına sahip bir Kişi sınıfına dayalı olarak bir kişi tablosu gösterecektir.

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", "[email protected]"), 
     new Person("Isabella", "Johnson", "[email protected]"), 
     new Person("Ethan", "Williams", "[email protected]"), 
     new Person("Emma", "Jones", "[email protected]"), 
     new Person("Michael", "Brown", "[email protected]") 
    ); 

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

Açıklama

Özellikler 've ObservableLists kullanmanın amacı bu dinlenebilir unsurlar olmasıdır. Özellikler kullanıldığında, datamodel'de bir özellik niteliğinin değeri değişirse, TableView öğesindeki öğenin görünümü, güncelleştirilmiş olan datamodel değerine uyacak şekilde otomatik olarak güncelleştirilir. Örneğin, bir kişinin e-posta özelliğinin değeri yeni bir değere ayarlanmışsa, söz konusu güncelleme özellik değişimini dinlediğinden TableView'e yansıtılır. Bunun yerine, e-postayı temsil etmek için düz bir String kullanılmışsa, TableView, e-posta değeri değişikliklerinden habersiz olacağı için yenilenmez.

PropertyValueFactory belgeler bu işlem ayrıntılı açıklanmaktadır:

bu sınıf nasıl kullanılacağına dair bir örnek aşağıda verilmiştir: Bu örnekte

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

, "ad" dizge bir referans olarak kullanılmıştır Kişi sınıfı türünde bir varsayılan firstNameProperty() yöntemine ( TableView öğeleri listesinin sınıf türü). Ayrıca, bu yöntem bir Mülk örneğini döndürmelidir. Bu gereksinimlerini karşılayan bir yöntem bulunursa, bu Tablo ObservableValue ile doldurulur. Buna ek olarak, TableView, döndürülen değere otomatik olarak bir gözlemcisi ekleyecektir; böylece, yapılan herhangi bir değişiklik, TableView tarafından gözlenen olacaktır ve hücrenin hemen güncellenmesiyle sonuçlanır. Bu modelle eşleşen hiçbir yöntem varsa

, sonbahar-yoluyla (olsun diyoruz teşebbüsten destek) veya() ( olduğunu, getFirstName() veya yukarıdaki örnekte isFirstName()) bulunmaktadır.Bu desenle eşleşen bir yöntem varsa, bu yöntemden döndürülen değer bir ReadOnlyObjectWrapper içinde sarılmış ve TableCell'e döndürülen olur. Ancak, bu durumda, bu, TableCell'in olmayacağı anlamına gelir ve Gözlemlenebilir Değer için değişiklikleri gözlemleyemez (yukarıdaki ilk yaklaşımında olduğu gibi). İşte Güncelleme

bir özellik tabanlı öğenin değerine öğeleri ve değişikliklerin ObservableList var bir TableView değişikliklere göre yenilemek otomatik gözlemlemek ve nasıl önemli bir rol birinci örneğe zıt örnektir bağlıyor.

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", "[email protected]"), 
     new Person("Isabella", "Johnson", "[email protected]"), 
     new Person("Ethan", "Williams", "[email protected]"), 
     new Person("Emma", "Jones", "[email protected]"), 
     new Person("Michael", "Brown", "[email protected]") 
    ); 
    } 

    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 [email protected]"); 
    setEmailButton.setOnAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent event) { 
     if (data.size() > 0) { 
      data.get(0).setEmail("[email protected]"); 
     } 
     } 
    }); 

    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. 
    } 
} 
+0

Her şeyden önce, cevabınız için çok teşekkür ederim, eğer sana 1'den fazla başparmak vermiş olsaydım :) İkinci olarak, söyleyeceğiniz şey Strings'i bir SimpleStringProperty dosyasına dönüştürerek tablonun otomatik olarak güncellenmesidir. Ve değil seçerek tablo manuel olarak güncellemek zorunda kalacak? –

+0

Marc'ın ek sorusunu yanıtlamak için PropertyValueFactory'den cevaba bir alıntı ekledi. – jewelsea

+0

Masanın biri değiştiğinde tablo otomatik olarak güncellenecek ve eğer öyleyse bunu nasıl yapacaksınız? Listeyi değiştirirseniz veya object.setName() yöntemini kullanarak değeri ayarlarm (örnek olarak) –