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 определить это.

Надеюсь это поможет.

Другие вопросы по тегам