2012-11-22 150 views
4

我正在忙於編寫教程,並被困在一點上。JavaFx - 如何在TableView中顯示SimpleStringProperty值

基本上在表視圖中啓動新場景並從ObservableList類型Person中顯示值。

person類由3個SimpleStringProperty的firsName,lastName和email組成。

但是,當我運行應用程序似乎顯示錶中的SimpleStringProperty [StringProperty [value:actualvalue]]的值,而不是SimpleStringProperty的值。如果我將Person的類getFirstName方法更改爲返回String firstName.get(),則它會在表中正確顯示值。

我應該使用SimpleStringProperty還是像String這樣的普通對象? enter image description here

Person類

package co.za.chrispie.addressBook; 

import javafx.beans.property.SimpleStringProperty; 

public class Person { 

private SimpleStringProperty firstName; 
private SimpleStringProperty lastName; 
private SimpleStringProperty email; 

public Person(final String firstName, final String lastName, final String email) { 
    this.firstName = new SimpleStringProperty(firstName); 
    this.lastName = new SimpleStringProperty(lastName); 
    this.email = new SimpleStringProperty(email); 
} 

public String getFirstName() { 
    return firstName.get(); //Changes this method to return a String 
} 

public SimpleStringProperty getLastName() { 
    return lastName; 
} 

public SimpleStringProperty getEmail() { 
    return email; 
} 

} 

控制器類

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 
package co.za.chrispie.addressBook; 

import java.net.URL; 
import java.util.ResourceBundle; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.fxml.FXML; 
import javafx.fxml.Initializable; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.control.cell.PropertyValueFactory; 

public class OracleAddressBookController implements Initializable { 

@FXML 
TableView<Person> table; 
@FXML 
TableColumn<Person, String> colFirstName; 
@FXML 
TableColumn<Person, String> colLastName; 
@FXML 
TableColumn<Person, String> colEmail; 

final ObservableList<Person> data = FXCollections.observableArrayList(
    new Person("Jaco", "Pieters", "[email protected]"), 
    new Person("Chrispie", "Pieters", "[email protected]") 
); 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    assert colFirstName != null : "fx:id=\"colFirstName\" was not injected: check your FXML file 'OracleAddressBook.fxml'."; 
    assert colLastName != null : "fx:id=\"colLastName\" was not injected: check your FXML file 'OracleAddressBook.fxml'."; 
    assert colEmail != null : "fx:id=\"colEmail\" was not injected: check your FXML file 'OracleAddressBook.fxml'."; 
    configureTable(); 
}  

private void configureTable() { 
    colFirstName.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName")); 
    colLastName.setCellValueFactory(new PropertyValueFactory<Person, String>("lastName")); 
    colEmail.setCellValueFactory(new PropertyValueFactory<Person, String>("email")); 

    table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 

    table.setItems(data); 
    assert table.getItems() == data; 
} 
} 

和前端FXML

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.net.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="500.0" prefWidth="600.0" styleClass="mainFxmlClass" xmlns:fx="http://javafx.com/fxml" fx:controller="co.za.chrispie.addressBook.OracleAddressBookController"> 
<children> 
    <Label layoutX="14.0" layoutY="11.0" text="Address Book" /> 
    <TableView fx:id="table" layoutX="14.0" layoutY="35.0" prefHeight="451.0" prefWidth="572.0"> 
    <columns> 
    <TableColumn prefWidth="75.0" text="First Name" fx:id="colFirstName" /> 
    <TableColumn prefWidth="75.0" text="Last Name" fx:id="colLastName" /> 
    <TableColumn prefWidth="75.0" text="Email" fx:id="colEmail" /> 
    </columns> 
</TableView> 
</children> 
    <stylesheets> 
    <URL value="@oracleaddressbook.css" /> 
</stylesheets> 
</AnchorPane> 
+1

我發現這個解釋很有用:[JavaFX Property Architecture](https://wiki.openjdk.java.net/display/OpenJFX/JavaFX+Property+Architecture) – will

回答

8

你需要改變你的財產的getter的名字nameProperty(),其中名稱是你的財產。所以你會有firstNameProperty()和emailProperty()。

getName()工程,但該表不會觀察屬性的更改。

爲PropertyValueFactory的文檔解釋這個問題:

在這個例子中,「名字」的字符串被用作在Person類類型的引用,以假定的firstNameProperty()方法(它是類的類型TableView項目列表)。另外,這個方法必須返回一個Property實例。如果找到滿足這些要求的方法,則使用此ObservableValue填充TableCell。另外,TableView會自動將觀察者添加到返回的值中,以便TableView可以觀察到觸發的任何更改,從而導致單元立即更新。

如果沒有方法匹配該模式的存在,有落空支持試圖呼叫得到()或爲()(即,在上面的例子中的getFirstName()或isFirstName())。如果存在與此模式匹配的方法,則從此方法返回的值將包裝在ReadOnlyObjectWrapper中並返回到TableCell。但是,在這種情況下,這意味着TableCell將無法觀察ObservableValue的變化(如上面第一種方法中的情況)。

相關問題