JavaFX устанавливает цвет или значок в ячейке столбца таблицы, если
Я все еще довольно новичок в Java-программировании и борюсь с пониманием некоторых концепций - особенно настройки TableColumn
значение ячейки. (Если кто-нибудь может объяснить это с точки зрения непрофессионала, это было бы здорово!)
Вот мой вопрос...
У меня есть таблица, которую я загружаю с ObservableList
исходя из моей таблицы данных в базе данных дерби. Цикл for, который добавляет данные в таблицу - это то, что я узнал, просматривая онлайн, и он определенно сработал для меня. Я хочу сделать еще один шаг вперед, так что вот моя задача...
ObservalbleList
будет что-то вроде примера: строка 1[игрушка, высокий и т. д.] строка 2 [коробка, средний и т. д.] и т. д. Теперь я хочу, чтобы код посмотрел на этот список, чтобы увидеть, если в этой строке - получить 1-е значение и если это равняется высоким, средним или низким, то добавьте цветную иконку в столбец статуса, который я назначу (или цветную заливку, если иконка слишком большая). Это мой код, и, вероятно, было бы разумно, если бы эта цветная иконка также была в цикле for. Вся эта особенность, которую я пытаюсь достичь, аналогична условному форматированию в Excel.
data = FXCollections.observableArrayList();
while (rs.next()) {
ObservableList<String> row = FXCollections.observableArrayList();
for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++) {
row.add(rs.getString(i));
}
data.add(row);
data.add(row);
if (data.get(2).equals("High")) {
//***set cell icon red or color fill red with padding around***
}
}
mtable.setItems(data);
Любая помощь приветствуется! благодарю вас!
1 ответ
Для настройки TableColumn
ценности, я не буду объяснять это, так как на него уже был дан ответ, плюс вы не спрашиваете об этом. Вы можете найти больше информации в Как установить значение для ячейки в TableView в javafx и через некоторые быстрые поиски Google. Я искал "javafx установить значение tablecolumn"
У вас должна быть соответствующая модель данных Class
который имеет соответствующие методы для вашего набора данных, который вы получаете из вашей базы данных. Я не знаю, что находится в вашей базе данных, поэтому я просто использовал то, что вы разместили на картинке, т.е. Item Name
, Priority
, Status
,
Вы можете, конечно, добавить Circle
с вашим TableView
, но это должно быть соответствующим образом объявлено в вашей модели данных Class
,
Некоторые вещи вам также понадобятся, которые я не предоставил:
- Вам нужно будет проанализировать возврат вашей базы данных и сделать соответствующие вызовы конструктора данных. Я оставлю это на ваше усмотрение.
Хорошо, теперь перейдем к тому, что я предоставляю и что я сделал для этого.
Вам нужно будет использовать вашу модель данных Class
для хранения возвращаемых данных базы данных, поэтому важно правильно их настроить. Таким образом, для каждого элемента данных, о котором вы заботитесь после своего возвращения, он должен иметь соответствующий set
а также get
метод.
В вашем цикле возврата данных вам нужно будет создать new DataModel(x, y, z, ...);
и добавить это к ObservableList<DataModel>
,
Вот пример базы с рисунком, который вы предоставили:
Main.java
public class Main extends Application {
@Override
public void start(Stage primaryStage) {
TableView<Data> dataTable = new TableView<>();
TableColumn<Data, String> itemName = new TableColumn<>("Item Name");
itemName.setCellValueFactory(cell -> new SimpleStringProperty(cell.getValue().getName()));
TableColumn<Data, String> priority = new TableColumn<>("Priority");
priority.setCellValueFactory(cell -> new SimpleStringProperty(cell.getValue().getPriority()));
TableColumn<Data, Circle> status = new TableColumn<>("Status");
status.setCellValueFactory(cell -> new SimpleObjectProperty<>(cell.getValue().getStatus()));
dataTable.getColumns().addAll(itemName, priority, status);
ObservableList<Data> data = FXCollections.observableArrayList();
Data high = new Data("toy", "high");
Data medium = new Data("box", "medium");
Data low = new Data("candy", "low");
data.addAll(high, medium, low);
dataTable.setItems(data);
Scene scene = new Scene(dataTable, 500, 500);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Data.java (это моя модель данных)
public class Data {
private String name;
private String priority;
private Circle status;
public Data (String name, String priority){
setName(name);
setPriority(priority);
setStatus(priority);
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getPriority(){
return priority;
}
public void setPriority(String priority){
this.priority = priority;
}
public Circle getStatus(){
return status;
}
public void setStatus(String priority){
Circle c = new Circle(5);
switch(priority){
case "high":
c.setFill(Color.GREEN);
break;
case "medium":
c.setFill(Color.YELLOW);
break;
case "low":
c.setFill(Color.RED);
break;
default:
}
status = c;
}
}
Как видите, я не предоставил status
в Constructor
Скорее я использовал Priority
определить это.
Надеюсь это поможет.