根据用于填充表的列表元素中未显示的JavaBean值设置JavaFXML表行文本颜色
我正在尝试将我在swing中构建的应用程序转换为JavaFx。这包括修改GUI设计。应用程序按如下方式处理数据:
从数据库中检索数据。数据库中的每一行都被解析为一个Javabean,每个bean都被添加到一个ArrayList中。然后将数组列表返回给调用方法,然后解析为ObservableList,使其与JavaFXTableView兼容。然后,我通过向表中添加每个列表元素(一个JavaBean)来填充该表
值得注意的是,组成表的每一行的JavaBean有12个元素。该表在其9列中仅向用户显示其中的9个。我试图做的是,获取rows列表元素中其他未显示的值之一,并使用该值确定显示行的文本颜色是否设置为红色或绿色。我似乎无法处理这件事。我在Stack和其他论坛上研究了其他几个类似的问题,它们似乎解决了为特定单元格或列而不是行设置单元格文本颜色的问题。它们似乎也依赖于可见的显示值来实现这一点。我试过几种方法,但似乎都不管用,而且似乎很复杂。必须有一个更直截了当的方法来完成我试图做的事情,因为这必须是一个相当普遍的要求。有人能告诉我怎么做吗
我的表格在FXML中定义如下:
<TableView fx:id="toDoTable" editable="true" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<columns>
<TableColumn fx:id="todoID" prefWidth="59.0" text="ID" />
<TableColumn id="columnHeader" fx:id="Charity" prefWidth="77.0" text="Charity" />
<TableColumn fx:id="todoFunder" prefWidth="101.0" text="Funder" />
<TableColumn fx:id="todoType" prefWidth="92.0" text="Task Type" />
<TableColumn fx:id="todoInternalDeadline" prefWidth="145.0" text="Internal Deadline" />
<TableColumn fx:id="todoExternalDeadline" prefWidth="145.0" text="External Deadline" />
<TableColumn fx:id="todoHrs" prefWidth="140.0" text="Target Hours" />
<TableColumn fx:id="todoActualHrs" prefWidth="110.0" text="Actual Hours" />
<TableColumn fx:id="todoDescription" prefWidth="110.0" text="Description" />
</columns>
</TableView>
该表在相应控制器类的初始化方法中填充,如下所示:
public void initialize(URL url, ResourceBundle rb) {
todoID.setCellValueFactory(new PropertyValueFactory<>("taskID"));
todoClient.setCellValueFactory(new PropertyValueFactory<>("Charity"));
todoFunder.setCellValueFactory(new PropertyValueFactory<>("taskFunder"));
todoType.setCellValueFactory((new PropertyValueFactory<>("taskType")));
todoInternalDeadline.setCellValueFactory((new PropertyValueFactory<>("internalDeadline")));
todoExternalDeadline.setCellValueFactory((new PropertyValueFactory<>("externalDeadline")));
todoHrs.setCellValueFactory((new PropertyValueFactory<>("assignedHours")));
todoActualHrs.setCellValueFactory((new PropertyValueFactory<>("hoursCompleted")));
todoDescription.setCellValueFactory((new PropertyValueFactory<>("taskDescription")));
ObservableList<Task> list = FXCollections.observableArrayList(parseTaskBeans());//parseTaskBeans();
toDoTable.getItems().addAll(list);
GuiUtility.autoResizeColumns(toDoTable);
//toDoTable.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
toDoTable.autosize();
}
虽然上面的内容将填充整个表,但我认为我需要单独处理这些行,并在将它们添加到视图之前为它们着色。我假设颜色必须是table元素的属性,而不是List,因为List只是数据。我最近的尝试如下,但我认为这肯定是完全错误的,因为我无法找到一种方法来获取行中的文本以定义其颜色。所以我留下了一些评论,我认为我需要添加代码来解决这个问题:
for(int i = 0; i<list.size(); i++){
System.out.println(list.get(i).getTaskReturned());
if(list.get(i).getTaskReturned().equalsIgnoreCase("false")){
//set Color red
}
else{
//set color green
}
toDoTable.getItems().add(list.get(i));
}
我的另一个想法是使用lambda来处理表中的行内容,但我可以再次看到如何处理实际的行。一个单元格一个单元格地设置每个元素似乎真的很复杂,所以一定有一种完全不同的方式来思考这个问题,我不明白。如果有人能解释并告诉我怎么做,我将不胜感激
# 1 楼答案
代码示例,希望对您的案例有所帮助:
输出屏幕:
Java文档对其工作原理的说明:
以及一行中每个单元格的updateItem调用: