获取要在Javafx中的Tableview中显示的LocalDate
我一直在开发我的应用程序的一部分,它允许用户输入学校放假的假期,并将其保存到文件中。假日和日期(存储为LocalDate对象)的名称从文件中读取并存储在假日对象中,然后放入可观察的arraylist中 这是主控制器:获取要在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
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
aSimpleStringProperty
中添加日期,并在代码的所有其他部分将其转换为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));
}
}
});
}