Я пытаюсь перевести приложение, созданное мной в Swing, на JavaFx.Это включает в себя капитальный ремонт дизайна GUI.Приложение обрабатывает данные следующим образом:
Данные извлекаются из базы данных.Каждая строка в базе данных анализируется на Java-бин, и каждый бин добавляется в ArrayList.Список массивов затем возвращается вызывающему методу, а затем анализируется в ObservableList, чтобы сделать его совместимым с табличным представлением JavaFX.Затем я заполняю таблицу, добавляя к ней каждый элемент списка - который является Java-бином.
Важно отметить, что Java-бин, составляющий каждую строку таблицы, имеет 12 элементов.Таблица отображает только 9 из них для пользователя в своих 9 столбцах.То, что я пытаюсь сделать, это взять одно из других неотображаемых значений в элементе List строк и использовать это, чтобы определить, установлен ли цвет текста отображаемой строки на красный или зеленый.Я не могу справиться с этим.Я рассмотрел несколько других похожих вопросов на стеке и других форумах, и они, кажется, решают проблему установки цвета текста ячейки для конкретной ячейки или столбца, но не для строки.Они также, кажется, делают это, полагаясь на видимое отображаемое значение.Я пробовал несколько подходов, но ни один из них не работает, и они кажутся сложными.Должен быть гораздо более прямой подход к тому, что я пытаюсь сделать, поскольку это должно быть довольно распространенным требованием.Может кто-нибудь показать мне, как это сделать?
Моя таблица определяется в 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));
}
Еще одна мысль, которая у меня возникла, - использовать лямбду для обработки содержимого строки таблицы, но снова я вижу, как получитьв фактическом ряду.Кажется действительно сложным устанавливать каждый элемент ячейка за ячейкой, поэтому должен быть совершенно другой способ думать об этом, чего я не понимаю.Если бы кто-то мог объяснить и показать мне, как это сделать, я был бы признателен.