获取要在Javafx中的Tableview中显示的LocalDate

获取要在Javafx中的Tableview中显示的LocalDate,java,javafx,tableview,localdate,Java,Javafx,Tableview,Localdate,我一直在开发我的应用程序的一部分,它允许用户输入学校放假的假期,并将其保存到文件中。假日和日期(存储为LocalDate对象)的名称从文件中读取并存储在假日对象中,然后放入可观察的arraylist中 这是主控制器: import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.control.*; import javafx.scene.layout.BorderPane; import javafx.s

我一直在开发我的应用程序的一部分,它允许用户输入学校放假的假期,并将其保存到文件中。假日和日期(存储为LocalDate对象)的名称从文件中读取并存储在假日对象中,然后放入可观察的arraylist中

这是主控制器:

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.*;
import javafx.scene.layout.BorderPane;
import javafx.stage.FileChooser;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Optional;


public class Controller {
    @FXML
    private BorderPane mainGridPane;
    private ArrayList<Job> jobs = new ArrayList<>();
    private static XSSFRow row;
    private boolean fileClosed = false;
    @FXML
    private DatePicker employeeStartDate;
    @FXML
    private Label evaluation40;
    @FXML
    private Label evaluation80;
    @FXML
    private Label evaluation120;
    @FXML
    private DatePicker summerStart;
    @FXML
    private DatePicker summerEnd;
    @FXML
    private DatePicker fallStart;
    @FXML
    private DatePicker fallEnd;
    @FXML
    private TableView<Holiday> tableView;

    private HolidayData data;

    public void initialize() throws IOException {
        data = new HolidayData();
        data.loadHolidays();
        tableView.setItems(data.getHolidays());

    }
导入javafx.fxml.fxml;
导入javafx.fxml.fxmloader;
导入javafx.scene.control.*;
导入javafx.scene.layout.BorderPane;
导入javafx.stage.FileChooser;
导入org.apache.poi.ss.usermodel.Cell;
导入org.apache.poi.ss.usermodel.DataFormatter;
导入org.apache.poi.ss.usermodel.Row;
导入org.apache.poi.xssf.usermodel.XSSFRow;
导入org.apache.poi.xssf.usermodel.xssfheet;
导入org.apache.poi.xssf.usermodel.xssf工作簿;
导入java.io.File;
导入java.io.IOException;
导入java.time.LocalDate;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.Optional;
公共类控制器{
@FXML
私有边框窗格主网格窗格;
私有ArrayList作业=新建ArrayList();
私有静态XSSFRow行;
私有布尔fileClosed=false;
@FXML
私人日期选择器雇员开始日期;
@FXML
自有品牌评估40;
@FXML
自有品牌评估80;
@FXML
自有品牌评估120;
@FXML
私人日期选择器;
@FXML
私人日期采集器;
@FXML
私有日期选择器fallStart;
@FXML
私有日期选择器失效;
@FXML
私有TableView TableView;
私人度假数据;
public void initialize()引发IOException{
数据=新的HolidayData();
data.loadHolidays();
setItems(data.getHolidays());
}
这是假日班:

import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import java.time.LocalDate;

public class Holiday {
    private SimpleStringProperty name = new SimpleStringProperty();
    private ObjectProperty<LocalDate> date;


    public Holiday(String name, LocalDate date) {
        this.name.set(name);
        this.date = new SimpleObjectProperty<>(date);
    }

    public String getName() {
        return name.get();
    }

    public SimpleStringProperty nameProperty() {
        return name;
    }

    public LocalDate getDate() {
        return date.get();
    }

    public ObjectProperty<LocalDate> dateProperty() {
        return date;
    }
导入javafx.beans.property.ObjectProperty;
导入javafx.beans.property.SimpleObject属性;
导入javafx.beans.property.SimpleStringProperty;
导入java.time.LocalDate;
公休假日{
私有SimpleStringProperty名称=新SimpleStringProperty();
私有财产日期;
公共假日(字符串名称,LocalDate){
this.name.set(name);
this.date=新的SimpleObject属性(日期);
}
公共字符串getName(){
返回name.get();
}
公共SimpleStringProperty nameProperty(){
返回名称;
}
公共LocalDate getDate(){
返回日期。get();
}
公共对象属性dateProperty(){
返回日期;
}
这是HolidayData类,负责从文件中读取数据并生成可观察的arraylist:

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Iterator;

public class HolidayData {
     private static HolidayData instance = new HolidayData();
     private static String fileName = "schoolHolidays.txt";
     private DateTimeFormatter formatter;

     private ObservableList<Holiday> holidays;

     public HolidayData(){
         formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
     }

    public static HolidayData getInstance() {
        return instance;
    }

    public static String getFileName() {
        return fileName;
    }

    public ObservableList<Holiday> getHolidays(){
         return holidays;
    }

    public void addHoliday(Holiday holiday){
         holidays.add(holiday);
    }


    public void loadHolidays() throws IOException {
        holidays = FXCollections.observableArrayList();
        Path path = Paths.get(fileName);
        BufferedReader br = Files.newBufferedReader(path);

        String input;
        try{
            while((input = br.readLine()) != null){
                String[] holidayPieces = input.split("\t");

                String name = holidayPieces[0];
                String dateString =  holidayPieces[1];

                LocalDate date = LocalDate.parse(dateString, formatter);
                Holiday holiday = new Holiday(name, date);
                holidays.add(holiday);
            }
        }catch(IOException e) {
            e.printStackTrace();
        } finally{
            if(br != null){
                br.close();
            }
        }
    }

    public void storeHolidays()throws IOException{
        Path path = Paths.get(fileName);
        BufferedWriter bw = Files.newBufferedWriter(path);
        try {
            Iterator<Holiday> iter = holidays.iterator();
            while(iter.hasNext()){
                Holiday holiday = iter.next();
                bw.write(String.format("%s\t%s", holiday.getName(), holiday.getDate().format(formatter)));
                bw.newLine();
            }
        }finally {
            if (bw != null){
                bw.close();
            }

        }
    }

    public void deleteHoliday(Holiday holiday){
        holidays.remove(holiday);
    }
}
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.IOException;
导入java.nio.file.Files;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.time.LocalDate;
导入java.time.format.DateTimeFormatter;
导入java.util.Iterator;
公共类度假数据{
私有静态HolidayData实例=新HolidayData();
私有静态字符串fileName=“schoolHolidays.txt”;
专用DateTimeFormatter格式化程序;
私人假期;
公共假期数据(){
格式化程序=模式的DateTimeFormatter.of(“dd-MM-yyyy”);
}
公共静态HolidayData getInstance(){
返回实例;
}
公共静态字符串getFileName(){
返回文件名;
}
公众假期{
返程假期;
}
公众假期(假日){
假日。添加(假日);
}
public void loadHolidays()引发IOException{
假日=FXCollections.observableArrayList();
Path Path=Path.get(文件名);
BufferedReader br=Files.newBufferedReader(路径);
字符串输入;
试一试{
而((input=br.readLine())!=null){
字符串[]holidayPieces=input.split(“\t”);
字符串名称=holidayPieces[0];
字符串dateString=holidayPieces[1];
LocalDate=LocalDate.parse(日期字符串,格式化程序);
假日=新假日(名称、日期);
假日。添加(假日);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
如果(br!=null){
br.close();
}
}
}
public void storeHolidays()引发IOException{
Path Path=Path.get(文件名);
BufferedWriter bw=Files.newBufferedWriter(路径);
试一试{
迭代器iter=holidays.Iterator();
while(iter.hasNext()){
假日=iter.next();
write(String.format(“%s\t%s”,holiday.getName(),holiday.getDate().format(格式化程序));
换行符();
}
}最后{
如果(bw!=null){
bw.close();
}
}
}
公众假期(假日){
假日。移除(假日);
}
}
这是FXML文件的tableView部分:



我遇到的问题是,
java.lang.ClassCastException
说不能将表列强制转换到某个对象,我认为这是
LocalDate
对象。我正在使用SimpleObject属性将其数据绑定到FXML文件,但我似乎无法使其工作。我唯一能想到的另一件事就是使在
Holiday
a
SimpleStringProperty
中添加日期,并在代码的所有其他部分将其转换为
LocalDate
,但这似乎是不必要的。我感谢任何人能给我的见解。

TL;DR版本:你把
cellValueFactory
dateColumn.setCellValueFactory(holidayRowData -> holidayRowData.getValue().dateProperty());
dateColumn.setCellValueFactory(new PropertyValueFactory<>("date"));
@FXML
private TableColumn<Holiday, LocalDate> dateColumn ;
public void initialize() throws IOException {
    data = new HolidayData();
    data.loadHolidays();
    tableView.setItems(data.getHolidays());

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
    dateColumn.setCellFactory(column -> new TableCell<Holiday, LocalDate>() {
        @Override
        protected void updateItem(LocalDate date, boolean empty) {
            super.updateItem(date, empty);
            if (empty) {
                setText("");
            } else {
                setText(formatter.format(date));
            }
        }
    });
}