#java #javafx #arraylist #netbeans #observablelist
#java #javafx #список массивов #netbeans #observablelist
Вопрос:
Я создаю программу, позволяющую арендодателям регистрировать новых арендаторов с заданной информацией. Программа отлично записывает и считывает в файл, но проблема, с которой я сталкиваюсь, заключается в том, что использование ObservableList для заполнения TableView не будет работать со всеми данными. Пользователь расширяет person и имеет контактные данные. Отображается информация о персонаже. Но контактная информация не будет отображаться. Вот мой код:
Класс Contact
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;
}
}
Это мой основной контроллер JavaFX, который я хочу использовать для заполнения TableView
MainPanelController
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. Помогите!!!
Ответ №1:
JavaFX TableView PropertyValueFactory использует отражение, чтобы определить, какие значения отображать в ячейках таблицы.
Итак, когда вы говорите:
cityColumn.setCellValueFactory(new PropertyValueFactory<>("City"));
это означает, что cellValueFactory попытается найти метод с именем getCity() для заполнения ячеек в cityColumn .
Поскольку вы определяете свой TableColumn как:
TableColumn<Tenant, String> cityColumn = new TableColumn<>("City");
Фабрика ищет в классе Tenant подходящие средства получения для заполнения ячеек. Ваша проблема в том, что класс Tenant должен иметь получатели, но класс Contact имеет их вместо этого. Я бы предложил добавить оболочки для получения контактов в класс Tenant, т. е.
public String getCity(){
return contact.getCity();
}
Комментарии:
1. Есть ли более простой способ вместо создания дополнительных методов получения в классе tenant, поскольку в классе contact они уже определены. Это работает, но я думаю, что это немного избыточно.
2. Я использовал этот подход, потому что предполагал, что объединение двух классов не является вариантом. Я считаю, что это был бы самый простой подход. Другим подходом было бы написать собственную фабрику значений ячеек для элементов в классе contact вместо использования
PropertyValueFactory
но в любом случае вам нужно будет вызвать методы получения из класса contact.