0

I am using the following code to generate a TableView:

@FXML
private TableView<Customer> customerTable;
@FXML
private TableColumn<Customer, String> customerIDColumn;
@FXML
private TableColumn<Customer, String> customerNameColumn;
@FXML
private TableColumn<Customer, String> customerPhoneColumn;
@FXML
private TableColumn<Customer, String> customerAddressColumn;
@FXML
private TableColumn<Customer, String> customerPostalCodeColumn;
@FXML
private TableColumn<Customer, String> customerDivisionColumn;
@FXML
private TableColumn<Customer, String> customerCountryColumn;

ObservableList<Customer> customerOL = FXCollections.observableArrayList();

PropertyValueFactory<Customer, String> custCustomerIDFactory = new PropertyValueFactory<>("customerID");
PropertyValueFactory<Customer, String> custNameFactory = new PropertyValueFactory<>("customerName");
PropertyValueFactory<Customer, String> custPhoneFactory = new PropertyValueFactory<>("phone"); //String value "CustomerPhone" calls getCustomerPhone method
PropertyValueFactory<Customer, String> custCountryFactory = new PropertyValueFactory<>("country");
PropertyValueFactory<Customer, String> custDivisionFactory = new PropertyValueFactory<>("division");
PropertyValueFactory<Customer, String> custAddressFactory = new PropertyValueFactory<>("address");
PropertyValueFactory<Customer, String> custPostalCodeFactory = new PropertyValueFactory<>("postalCode");

customerIDColumn.setCellValueFactory(custCustomerIDFactory);
customerNameColumn.setCellValueFactory(custNameFactory);
customerPhoneColumn.setCellValueFactory(custPhoneFactory);
customerCountryColumn.setCellValueFactory(custCountryFactory);
customerDivisionColumn.setCellValueFactory(custDivisionFactory);
customerAddressColumn.setCellValueFactory(custAddressFactory);
customerPostalCodeColumn.setCellValueFactory(custPostalCodeFactory);

Customer cust = new Customer();
cust.setCustomerID(result.getInt("Customer_ID"));
cust.setCustomerName(result.getString("Customer_Name"));
cust.setCustomerPhone(result.getString("Phone"));
cust.setCustomerAddress(result.getString("Address"));
cust.setCustomerPostalCode(result.getString("Postal_Code"));
cust.setCustomerDivision(result.getString("Division"));
cust.setCustomerCountry(result.getString("Country"));

customerOL.addAll(cust);

customerTable.setItems(customerOL);

the above is a part of java code. But I think it explains what I am trying to do. The line customerOL.addAll(cust); adds 3 customer data into the customerOL object. The Country, Division, etc all values are getting populated properly in the object. But when the table view is generated strangely I only see the values of ID and Customer Name being populated. The rest of the values are empty as could be seen below:

enter image description here

enter image description here

I am not sure what could be causing this. Here is the FXML file corresponding to this

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

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<AnchorPane fx:id="customerAddLabel" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
            minWidth="-Infinity" prefHeight="683.0" prefWidth="824.0"
            style="-fx-background-color: silver; -fx-border-color: black; -fx-border-radius: 5;"
            xmlns="http://javafx.com/javafx/10.0.1" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="c195.View_Controller.CustomerScreenController">
    <children>
        <Label alignment="TOP_CENTER" layoutX="300.0" layoutY="14.0" prefHeight="38.0" prefWidth="226.0"
               style="-fx-border-color: gray; -fx-border-radius: 5;" text="Customer" textAlignment="CENTER">
            <font>
                <Font name="System Bold Italic" size="25.0"/>
            </font>
        </Label>
        <AnchorPane layoutX="16.0" layoutY="102.0" prefHeight="404.0" prefWidth="363.0"
                    style="-fx-background-color: white;">
            <children>
                <TableView fx:id="customerTable" layoutY="1.0" prefHeight="403.0" prefWidth="363.0"
                           style="-fx-border-color: black; -fx-border-radius: 5;">
                    <columns>
                        <TableColumn fx:id="customerIDColumn" prefWidth="63.0" text="ID"/>
                        <TableColumn fx:id="customerNameColumn" prefWidth="175.0" text="Customer Name"/>
                        <TableColumn fx:id="customerPhoneColumn" prefWidth="123.0" text="Phone"/>
                        <TableColumn fx:id="customerAddressColumn" prefWidth="123.0" text="Address"/>
                        <TableColumn fx:id="customerPostalCodeColumn" prefWidth="123.0" text="Postal Code"/>
                        <TableColumn fx:id="customerDivisionColumn" prefWidth="123.0" text="Division"/>
                        <TableColumn fx:id="customerCountryColumn" prefWidth="123.0" text="Country"/>

                    </columns>
                </TableView>
            </children>
        </AnchorPane>
        <TitledPane alignment="CENTER" animated="false" layoutX="413.0" layoutY="100.0" prefHeight="464.0"
                    prefWidth="374.0" text="Customer Details">
            <content>
                <GridPane prefHeight="292.0" prefWidth="373.0">
                    <columnConstraints>
                        <ColumnConstraints hgrow="SOMETIMES" maxWidth="172.2000732421875" minWidth="10.0"
                                           prefWidth="99.80004272460937"/>
                        <ColumnConstraints hgrow="SOMETIMES" maxWidth="268.199951171875" minWidth="10.0"
                                           prefWidth="253.39995727539065"/>
                    </columnConstraints>
                    <rowConstraints>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                        <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES"/>
                    </rowConstraints>
                    <children>
                        <TextField fx:id="customerCustomerIDTextField" onAction="#CustomerCustomerIDTextFieldHandler"
                                   GridPane.columnIndex="1" GridPane.rowIndex="1"/>
                        <Label fx:id="customerCustomerIDLabel" text="Customer ID" GridPane.rowIndex="1"/>
                        <Label fx:id="customerCustomerNameLabel" text="Company Name" GridPane.rowIndex="2"/>
                        <Label fx:id="customerAddressLabel" text="Address" GridPane.rowIndex="4"/>
                        <Label fx:id="customerAddress2Label" text="POC" GridPane.rowIndex="3"/>
                        <Label fx:id="customerCityLabel" text="City" GridPane.rowIndex="5"/>
                        <Label fx:id="customerCountryLabel" text="Country" GridPane.rowIndex="6"/>
                        <Label fx:id="customerPostalCodeLabel" text="Postal Code" GridPane.rowIndex="7"/>
                        <Label fx:id="customerPhoneLabel" text="Phone No." GridPane.rowIndex="8"/>
                        <TextField fx:id="customerCustomerNameTextField"
                                   onAction="#CustomerCustomerNameTextFieldHandler" GridPane.columnIndex="1"
                                   GridPane.rowIndex="2"/>
                        <TextField fx:id="customerAddressTextField" onAction="#CustomerAddressTextFieldHandler"
                                   GridPane.columnIndex="1" GridPane.rowIndex="4"/>
                        <TextField fx:id="customerAddress2TextField" onAction="#CustomerAddress2TextFieldHandler"
                                   GridPane.columnIndex="1" GridPane.rowIndex="3"/>
                        <ComboBox fx:id="customerCityComboBox" onAction="#CustomerCityComboBoxHandler" prefHeight="26.0"
                                  prefWidth="252.0" GridPane.columnIndex="1" GridPane.rowIndex="5"/>
                        <ComboBox fx:id="customerCountryComboBox" onAction="#CustomerCountryComboBoxHandler"
                                  prefHeight="26.0" prefWidth="252.0" GridPane.columnIndex="1" GridPane.rowIndex="6"/>
                        <TextField fx:id="customerPostalCodeTextField" onAction="#CustomerPostalCodeTextFieldHandler"
                                   GridPane.columnIndex="1" GridPane.rowIndex="7"/>
                        <TextField fx:id="customerPhoneTextField" onAction="#CustomerPhoneTextFieldHandler"
                                   GridPane.columnIndex="1" GridPane.rowIndex="8"/>
                        <HBox alignment="CENTER_LEFT" prefHeight="100.0" prefWidth="200.0" spacing="20.0"
                              GridPane.columnIndex="1">
                            <children>
                                <RadioButton fx:id="customerActiveRadioButton" mnemonicParsing="false"
                                             onAction="#CustomerActiveRadioButtonHandler" text="Active"/>
                                <RadioButton fx:id="customerInactiveRadioButton" mnemonicParsing="false"
                                             onAction="#CustomerInactiveRadioButtonHandler" text="Inactive"/>
                            </children>
                        </HBox>
                    </children>
                </GridPane>
            </content>
        </TitledPane>
        <ButtonBar layoutX="587.0" layoutY="564.0" prefHeight="40.0" prefWidth="200.0">
            <buttons>
                <Button fx:id="customerSaveButton" minWidth="66.0" mnemonicParsing="false"
                        onAction="#CustomerSaveButtonHandler" prefHeight="26.0" text="Save"/>
                <Button fx:id="customerCancelButton" mnemonicParsing="false" onAction="#CustomerCancelButtonHandler"
                        text="Cancel"/>
            </buttons>
        </ButtonBar>
        <ButtonBar layoutX="500.0" layoutY="613.0" prefHeight="40.0" prefWidth="200.0">
            <buttons>
                <Button fx:id="customerBackButton" mnemonicParsing="false" onAction="#CustomerBackButtonHandler"
                        text="Back"/>
                <Button fx:id="customerAddButton" mnemonicParsing="false" onAction="#CustomerAddButtonHandler"
                        text="Add"/>
                <Button fx:id="customerDeleteButton" mnemonicParsing="false" onAction="#CustomerDeleteButtonHandler"
                        text="Delete"/>
            </buttons>
        </ButtonBar>
        <Label fx:id="customerLabel" layoutX="542.0" layoutY="52.0" prefHeight="40.0" prefWidth="90.0"
               textFill="#1924e8">
            <font>
                <Font name="System Bold Italic" size="20.0"/>
            </font>
        </Label>
        <Label layoutX="34.0" layoutY="517.0" prefHeight="27.0" prefWidth="327.0"
               text="Click on Customer in Table to Update" textFill="#eb0c13">
            <font>
                <Font name="System Bold Italic" size="18.0"/>
            </font>
        </Label>
    </children>
</AnchorPane>

I am not sure how to debug this. As the values in the ObservableList<Customer> are getting populated properly, it just doesn't appear in the TableView.

Here is the Customer class:

public class Customer {

    private int customerID; //Auto incremented in database
    private String customerName;
    private int active;
    private Date createDate;
    private String createdBy;
    private String address;
    private String address2;
    private String division;
    private String postalCode;
    private String phone;
    private String country;
    private Date lastUpdate;
    private String lastUpdateBy;

    public Customer() {

    }

    public Customer(int customerID, String customerName, int active, String address, String address2, String division, String postalCode, String phone, String country, Date lastUpdate, String lastUpdateBy) {
        setCustomerID(customerID);
        setCustomerName(customerName);
        setCustomerActive(active);
        setCustomerAddress(address);
        setCustomerAddress2(address2);
        setCustomerDivision(division);
        setCustomerPostalCode(postalCode);
        setCustomerPhone(phone);
        setCustomerCountry(country);
        setCustomerLastUpdate(lastUpdate);
        setCustomerLastUpdateBy(lastUpdateBy);
    }

    public Customer(int customerID, String customerName) {
        setCustomerID(customerID); //this is Auto Incremented in the database
        setCustomerName(customerName);
    }
    
    public int getCustomerID() {
        return customerID;
    }

    public String getCustomerName() {
        return customerName;
    }

    public int getCustomerActive() {
        return active;
    }

    public String getCustomerAddress() {
        return address;
    }

    public String getCustomerAddress2() {
        return address2;
    }

    public String getCustomerCity() {
        return division;
    }

    public String getCustomerPostalCode() {
        return postalCode;
    }

    public String getCustomerPhone() {
        return phone;
    }

    public String getCustomerCountry() {
        return country;
    }

    public Date getCustomerLastUpdate() {
        return lastUpdate;
    }

    public String getCustomerLastUpdateBy() {
        return lastUpdateBy;
    }
    
    public void setCustomerID(int customerID) {
        this.customerID = customerID;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public void setCustomerActive(int active) {
        this.active = active;
    }

    public void setCustomerAddress(String address) {
        this.address = address;
    }

    public void setCustomerAddress2(String address2) {
        this.address2 = address2;
    }

    public void setCustomerDivision(String city) {
        this.division = city;
    }

    public void setCustomerPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public void setCustomerPhone(String phone) {
        this.phone = phone;
    }

    public void setCustomerCountry(String country) {
        this.country = country;
    }

    public void setCustomerLastUpdate(Date lastUpdate) {
        this.lastUpdate = lastUpdate;
    }

    public void setCustomerLastUpdateBy(String lastUpdateBy) {
        this.lastUpdateBy = lastUpdateBy;
    }
}
Oboe
  • 2,643
  • 2
  • 9
  • 17
sunny
  • 149
  • 8
  • 1
    Break on `getCustomerPhone()`, or any accessor of a missing column, and verify that it is being called; review your `Customer` properties and factories as suggested [here](https://stackoverflow.com/a/68969223/230513). – trashgod Sep 16 '21 at 16:39
  • Note the comment in the code (as well as the code) is strange and wrong: `new PropertyValueFactory<>("phone"); //String value "CustomerPhone" calls getCustomerPhone method`. Instead, the string to call the `getCustomerPhone` method should be`"customerPhone"`, so the constructor call should be `new PropertyValueFactory<>("customerPhone");`, Do look at the linked duplicate answers though and follow the lambda method for defining the cell value factory instead of using the `PropertyValueFactory`. For this, a lambda is superior and less error prone. – jewelsea Sep 17 '21 at 03:10

0 Answers0