【问题标题】:Java ObservableList not displaying some valuesJava ObservableList 不显示某些值
【发布时间】:2019-03-02 23:19:00
【问题描述】:

我正在创建一个程序,允许房东使用给定信息注册新租户。该程序完美地写入和读取文件,但我遇到的问题是使用 ObservableList 填充 TableView 无法处理所有数据。租户扩展人并具有联系方式。人员信息显示。但联系方式不会显示。这是我的代码:

联系班级

package entities;

import interfaces.ContactDetailsInterface;
import java.io.Serializable;

public class Contact implements ContactDetailsInterface, Serializable {
private static final long serialVersionUID = 3458489886428771425L;
private String StreetLine;
private String City;
private String Parish;
private String Country;
private String Email;
private String Telephone;
private String TRN;


/**
 * @return the StreetLine
 */
@Override
public String getStreetLine() {
    return StreetLine;
}

/**
 * @param StreetLine the StreetLine to set
 */
@Override
public void setStreetLine(String StreetLine) {
    this.StreetLine = StreetLine;
}

/**
 * @return the City
 */
@Override
public String getCity() {
    return City;
}

/**
 * @param City the City to set
 */
@Override
public void setCity(String City) {
    this.City = City;
}

/**
 * @return the Parish
 */
@Override
public String getParish() {
    return Parish;
}

/**
 * @param Parish the Parish to set
 */
@Override
public void setParish(String Parish) {
    this.Parish = Parish;
}

/**
 * @return the Country
 */
@Override
public String getCountry() {
    return Country;
}

/**
 * @param Country the Country to set
 */
@Override
public void setCountry(String Country) {
    this.Country = Country;
}

/**
 * @return the Email
 */
@Override
public String getEmail() {
    return Email;
}

/**
 * @param Email the Email to set
 */
@Override
public void setEmail(String Email) {
    this.Email = Email;
}

/**
 * @return the Telephone
 */
@Override
public String getTelephone() {
    return Telephone;
}

/**
 * @param Telephone the Telephone to set
 */
@Override
public void setTelephone(String Telephone) {
    this.Telephone = Telephone;
}

@Override
public void setTRN(String trn) {
    this.TRN = trn;
}

@Override
public String getTRN() {
 return TRN; 
}
}

租户类

package entities;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
import superclass.Person;

public class Tenant extends Person {

transient SimpleDateFormat dateFormat;
transient Calendar calendar;
transient Scanner in = new Scanner(System.in);

private String dateOfBirth;

//has a
private Contact contact;
private CalculatePayments payment;

private String registra;

public String getDateOfBirth() {
    return dateOfBirth;
}

/**
 * @param dateOfBirth the dateOfBirth to set
 */
public void setDateOfBirth(String dateOfBirth) {
    this.dateOfBirth = dateOfBirth;
}

/**
 * @return the contact
 */
public Contact getContact() {
    return contact;
}

/**
 * @param contact the contact to set
 */
public void setContact(Contact contact) {
    this.contact = contact;
}

/**
 * @return the payment
 */
public CalculatePayments getPayment() {
    return payment;
}

/**
 * @param payment the payment to set
 */
public void setPayment(CalculatePayments payment) {
    this.payment = payment;
}

/**
 * @return the registrar
 */
public String getRegistra() {
    return registra;
}

/**
 * @param registra the registrar to set
 */
public void setRegistra(String registra) {
    this.registra = registra;
}

}

这是我想用来填充 TableView 的主要 JavaFX 控制器

主面板控制器

public class MainPanelSceneController implements Initializable {

@FXML
private TableView tenantTable;

/**
 * Initializes the controller class.
 *
 * @param url
 */
@Override
public void initialize(URL url, ResourceBundle rb) {

    //firstName
    TableColumn<Tenant, String> fnColumn = new TableColumn<>("First Name");
    fnColumn.setCellValueFactory(new PropertyValueFactory<>("FirstName"));

    //lastName
    TableColumn<Tenant, String> lnColumn = new TableColumn<>("Last Name");
    lnColumn.setCellValueFactory(new PropertyValueFactory<>("LastName"));

    //gender
    TableColumn<Tenant, String> genderColumn = new TableColumn<>("Gender");
    genderColumn.setCellValueFactory(new PropertyValueFactory<>("Gender"));

    //dob
    TableColumn<Tenant, String> dobColumn = new TableColumn<>("D.O.B");
    dobColumn.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));

    //Email
    TableColumn<Tenant, String> emailColumn = new TableColumn<>("Email");
    emailColumn.setCellValueFactory(new PropertyValueFactory<Tenant, String>("Email"));

    //Phone
    TableColumn<Tenant, String> phoneColumn = new TableColumn<>("Phone #");
    phoneColumn.setCellValueFactory(new PropertyValueFactory<>("Telephone"));

    //TRN
    TableColumn<Tenant, String> TRNColumn = new TableColumn<>("TRN");
    TRNColumn.setCellValueFactory(new PropertyValueFactory<>("TRN"));

    //Country
    TableColumn<Tenant, String> countryColumn = new TableColumn<>("Country");
    countryColumn.setCellValueFactory(new PropertyValueFactory<>("Country"));

    //Parish
    TableColumn<Tenant, String> parishColumn = new TableColumn<>("Parish");
    parishColumn.setCellValueFactory(new PropertyValueFactory<>("Parish"));

    //City
    TableColumn<Tenant, String> cityColumn = new TableColumn<>("City");
    cityColumn.setCellValueFactory(new PropertyValueFactory<>("City"));

    //StreetLine
    TableColumn<Tenant, String> streetColumn = new TableColumn<> 
 ("StreeLine");
    streetColumn.setCellValueFactory(new PropertyValueFactory<> 
   ("StreetLine"));

    tenantTable.setItems(getTenants());

    tenantTable.getColumns().addAll(fnColumn, lnColumn, genderColumn,
            dobColumn, emailColumn, TRNColumn,
            phoneColumn, countryColumn, parishColumn,
            cityColumn, streetColumn);
}

private ObservableList<Tenant> getTenants() {
    ObservableList<Tenant> observableList = 
FXCollections.observableArrayList();
    CrudOperations crud = new CrudOperations();
    ArrayList<Tenant> arr = (ArrayList<Tenant>) 
 crud.readObj(Files.TENANT_FILE);
    ListIterator itr = arr.listIterator();
    while (itr.hasNext()) {
        Tenant t = (Tenant) itr.next();
        observableList.add(t);
    }
    return observableList;
}

}

如前所述,observableList 仅显示来自 person 类的信息,但不会显示来自 contact 类的信息。救命!!!

【问题讨论】:

    标签: java javafx arraylist netbeans observablelist


    【解决方案1】:

    JavaFX TableView PropertyValueFactory 使用反射来确定要在表格单元格中显示的值。

    所以当你说:

    cityColumn.setCellValueFactory(new PropertyValueFactory<>("City"));
    

    这意味着 cellValueFactory 将尝试找到一个名为 getCity() 的方法来填充 cityColumn 中的单元格。

    由于您将 TableColumn 定义为:

    TableColumn<Tenant, String> cityColumn = new TableColumn<>("City");
    

    工厂在 Tenant 类中寻找合适的 getter 来填充单元格。您的问题是 Tenant 类需要有 getter,但 Contact 类有它们。我建议将联系人获取器的包装器添加到租户类,即

    public String getCity(){
      return contact.getCity();
    }
    

    【讨论】:

    • 有没有一种更简单的方法,而不是在租户类中创建额外的 getter,因为联系人类已经定义了它们。它有效,但我认为它有点多余。
    • 我使用这种方法是因为我认为组合这两个类不是一种选择。我相信这将是最简单的方法。另一种方法是为联系人类中的元素编写自己的单元格值工厂,而不是使用PropertyValueFactory,但无论哪种方式,您都需要从联系人类中调用 getter。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2012-11-16
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多