我正在尝试将我在 swing 中构建的应用程序转换为 JavaFx。这包括彻底检查 GUI 设计。应用程序按如下方式处理数据:
从数据库中检索数据。数据库中的每一行都被解析为一个 java bean,每个 bean 都被添加到一个 ArrayList 中。然后将数组列表返回给调用方法,然后解析为 ObservableList 以使其与 JavaFX tableview 兼容。然后,我通过向其中添加每个 List 元素(它是一个 java bean)来填充该表。
值得注意的是,构成表格每一行的 Java bean 有 12 个元素。该表在其 9 列中仅向用户显示其中的 9 个。我正在尝试做的是获取行列表元素中的其他未显示值之一,并使用它来确定显示行的文本颜色是设置为红色还是绿色。我似乎无法管理这个。我在 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();
}
虽然上面将填充整个表格,但我认为我需要做的是单独处理行并在将它们添加到视图之前为它们着色。我假设颜色必须是表格元素而不是列表的属性,因为列表只是数据。我最近的尝试如下,但我认为它一定是完全错误的,因为我无法获得一种方法来获取行中的文本来定义其颜色。所以我留下了评论,因为我认为我需要添加代码来解决这个问题:
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 来处理表格行内容,但我再次可以看到我是如何获得实际行的。逐个单元格地设置每个元素似乎真的很令人费解,因此必须有一种完全不同的方式来考虑这一点,而我没有得到。如果有人可以解释并告诉我如何做到这一点,我将不胜感激。
