热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

让LocalDate显示在Javafx的Tableview中

我一直在处理我的应用程序的一部分,该应用程序允许用户输入他们学校起飞的假期并将其保存到文件中.从文件中读取假日的名称和日期(存储为LocalDate对象)并存储在假日对象中并放入可观察的arra

我一直在处理我的应用程序的一部分,该应用程序允许用户输入他们学校起飞的假期并将其保存到文件中.从文件中读取假日的名称和日期(存储为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 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 tableView;
private HolidayData data;
public void initialize() throws IOException {
data = new HolidayData();
data.loadHolidays();
tableView.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 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 dateProperty() {
return date;
}

这是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 holidays;
public HolidayData(){
formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy");
}
public static HolidayData getInstance() {
return instance;
}
public static String getFileName() {
return fileName;
}
public ObservableList 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 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);
}
}

这是FXML文件的tableView部分:
















我遇到的问题是java.lang.ClassCastException,表示无法将表列强制转换为某个对象,我认为该对象是LocalDate对象.我使用SimpleObjectProperty将它数据绑定到FXML文件,但我似乎无法让它工作.我能想到的另一件事就是在Holiday中将日期设为SimpleStringProperty并将其转换为我代码中所有其他部分的LocalDate,但这似乎是不必要的.我很感激任何人都能给我的见解.

解决方法:

TL; DR版:您将cellValueFactory与cellFactory混淆.例如,参见this tutorial,以获得对差异的一个很好的解释,这对于下面这个特定的例子进行了总结.

表列的cellValueFactory是一个对象,它告诉列要在单元格中显示哪些值,或者更准确地说是如何从表示每行的对象中获取这些值.这由Callback,ObservableProperty>表示,即映射CellDataFeatures的功能.到ObservableValue.所以在Java代码中你会这样做

dateColumn.setCellValueFactory(holidayRowData -> holidayRowData.getValue().dateProperty());

或者,如果您更喜欢使用(有些遗留的)PropertyValueFactory类,您可以这样做

dateColumn.setCellValueFactory(new PropertyValueFactory<>("date"));

后一版本具有(许多缺点,但一个)优点,它也可以在FXML中完成.但请注意,您需要cellValueFactory,而不是cellFactory.所以你的FXML应该是
















相反,cellFactory是一个告诉列如何显示数据的对象.它由Callback,TableCell>表示,即映射TableColumn的功能.到TableCell.发生ClassCastException是因为您设置的单元格工厂将要传递TableColumn,但是期望接收CellDataFeatures,因此当它尝试对其进行处理时,转换将失败.

除了单元格值工厂之外,您可能还需要一个单元工厂,以便您可以控制日期的显示方式(例如,控制用于它的格式).如果您为日期列指定一个fx:id,请说,然后将其注入控制器

@FXML
private TableColumn dateColumn ;

然后在控制器的initialize方法中,你可以这样做:

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() {
@Override
protected void updateItem(LocalDate date, boolean empty) {
super.updateItem(date, empty);
if (empty) {setText("");
} else {setText(formatter.format(date));
}
}
});
}


推荐阅读
  • 在Java应用中实现只读模式的切换方法与技巧 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 注:写博客或者项目的README文档经常用到markdown语法,所以markdown的语法做了一个总结,本文是基于【markdown】基 ... [详细]
  • 本文介绍了Android动画的基本概念及其主要类型。Android动画主要包括三种形式:视图动画(也称为补间动画或Tween动画),主要通过改变视图的属性来实现动态效果;帧动画,通过顺序播放一系列预定义的图像来模拟动画效果;以及属性动画,通过对对象的属性进行平滑过渡来创建更加复杂的动画效果。每种类型的动画都有其独特的应用场景和实现方式,开发者可以根据具体需求选择合适的动画类型。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 尽管存在唯一列,仍显示“当前选择不包含唯一列。网格编辑、复选框、编辑、复制和删除功能不可用”的消息。 ... [详细]
  • 本文深入探讨了NDK与JNI技术在实际项目中的应用及其学习路径。通过分析工程目录结构和关键代码示例,详细介绍了如何在Android开发中高效利用NDK和JNI,实现高性能计算和跨平台功能。同时,文章还提供了从基础概念到高级实践的系统学习指南,帮助开发者快速掌握这些关键技术。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • 我正在使用 Ruby on Rails 构建个人网站。总体而言,RoR 是一个非常出色的工具,它提供了丰富的功能和灵活性,使得创建自定义页面变得既高效又便捷。通过利用其强大的框架和模块化设计,我可以轻松实现复杂的功能,同时保持代码的整洁和可维护性。此外,Rails 的社区支持也非常强大,为开发过程中遇到的问题提供了丰富的资源和解决方案。 ... [详细]
  • 探讨 `org.openide.windows.TopComponent.componentOpened()` 方法的应用及其代码实例分析 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
author-avatar
En199010221
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有