I am busy working on a textbook and stuck at one point.
Basically start new scenes and display values ββfrom an ObservableList of type Person in a table view.
The person class consists of 3 SimpleStringPropertys firsName, lastName and email.
But when I run the application, it seems to display the SimpleStringProperty [StringProperty [value: actual value]] values ββin the table, not the SimpleStringProperty value. If I changed the getFirstName method of the Person class to return String firstName.get (), then it will correctly display the value in the table.
Should I use SimpleStringProperty or fairly simple objects like String? 
Class man
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();
Controller class
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", " jp@me.co.za "), new Person("Chrispie", "Pieters", " chrispie@me.co.za ") ); @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; } }
and front end 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>