JavaFX在tablecolumn单元格中设置颜色或图标if

时间:2017-03-03 18:25:15

标签: java excel javafx tableview tablecolumn

我仍然是Java编程的新手,并且很难理解一些概念 - 尤其是设置TableColumn单元格值。 (如果有人能用外行的话来解释这一点,那就太棒了!)

这是我的问题......

我有一个tableview,我在derby数据库中加载了来自我的数据表的ObservableList。将数据添加到表中的for循环是我从在线查看中学到的东西,它确实对我有用。我想更进一步,所以这是我的挑战......

ObservalbleList会有类似的例子:第1行[玩具,高等]第2行[盒子,媒体等]等等。现在,我希望代码看这个列表看看如果在该行中 - 获取第一个值,如果等于高,中或低,则在我将分配的状态列中添加颜色图标(或者如果图标太多,则填充颜色)Example。这是我的代码,如果那个颜色图标片段也在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 个答案:

答案 0 :(得分:0)

对于TableColumn值的设置,我不会解释它,因为之前已经回答过,而且你不是在问这个问题。您可以在How to set value to cell in TableView in javafx和Google快速搜索中找到更多信息。我搜索了&#34; javafx set tablecolumn value&#34;

您应该拥有适当的数据模型Class,该数据模型具有适用于您从数据库获取的数据集的方法。我不知道您的数据库中有什么,所以我只是使用您在图片中发布的内容,即Item NamePriorityStatus

您当然可以将Circle添加到TableView,但应在数据模型Class中正确声明。

我还需要一些我没有提供的东西:

  • 您需要解析数据库返回并进行适当的数据构造函数调用。我会把它留给你。

好的,现在我要提供的内容以及我为实现目标所做的工作。

您需要使用数据模型Class来存储数据库返回,这就是为什么正确设置它的重要性。因此,对于您返回时关注的每个数据点,它应该具有适当的setget方法。

在返回数据的循环中,您需要创建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来确定它。

希望这有帮助。