【问题标题】:JavaFX Iterate through TableView cells (row wise) and set background colorJavaFX 遍历 TableView 单元格(逐行)并设置背景颜色
【发布时间】:2017-04-30 21:28:36
【问题描述】:

我的表格视图上有 31 列(第 1 天 - 第 31 天)和 12(月份名称)行。我想在完整的表格(row wise search)中搜索数据(天),并且只需要为匹配的单元格设置背景颜色。我可以看到可以为使用 cellfactory 函数在特定列中的单元格。

  birthdayColumn.setCellFactory(column -> {
        return new TableCell<Person, LocalDate>() {
            @Override
            protected void updateItem(LocalDate item, boolean empty) {
                super.updateItem(item, empty);
                  if (item == null || empty) {
            setText(null);
            setStyle("");
        } 

            // Style all dates in March with a different color.
            if (item. == Month.MARCH) {
                setTextFill(Color.CHOCOLATE);
                setStyle("-fx-background-color: yellow");
            } else {
                setTextFill(Color.BLACK);
                setStyle("");
            }
       };
    });

这里它只检查一个名为“birthdayColumn”的列。但在我的情况下,它应该以一种方法检查所有表格单元格(按行),并且只需要为匹配的单元格设置背景颜色。我该怎么做.提前谢谢你

【问题讨论】:

  • A TableView 似乎不太适合这样的日历显示。最好只使用GridPane 并自己管理单元格。我不太明白这里是如何设置的:birthdayColumn 是哪一列?我会想象有 31 个表列,它们基本上都是一样的。为什么行的数据模型称为Person???当然Month 会是一个更好的名字(你也许可以使用java.time.Month,这取决于你如何管理数据)。如果你真的想使用TableView,你需要展示更多你是如何设置的。

标签: tableview javafx-8


【解决方案1】:

这应该可行:

    LocalDate myBirthday = null; //initialize with the date you need to highlight

    birthdayColumn.setCellFactory(column -> {
        return new TableCell<Person, LocalDate>() {
            @Override
            protected void updateItem(LocalDate item, boolean empty) {
                super.updateItem(item, empty);
                if (item == null || empty) {
                    setText(null);
                    setGraphic(null);
                } 
                else {
                    setText(item.toString());
                    setGraphic(null);

                    if (item.equals(myBirthday)) {
                        setTextFill(Color.CHOCOLATE);
                        setStyle("-fx-background-color: yellow");
                    }
                    else {
                        setTextFill(Color.BLACK);
                        setStyle("");
                    }
                }
            }};
    });

【讨论】:

  • 感谢您的努力,但我想要逐行搜索。不是单列搜索。这里只搜索单列
  • 您必须为所有列设置相同的单元工厂,因为单元工厂是按列分配的,而不是按行分配的
  • 天哪。所以我应该为所有 31 列设置它。但是有没有其他方法不使用 cellfactory 来查找匹配的单元格值?
  • @ShareefAzeez 您大概已经在循环中创建列,对吧?只需将代码放置在同一循环中即可设置单元工厂。这没什么大不了的。
  • 好的,我明白了。考虑我只想搜索所有列的第一个单元格,这意味着我如何修改上述代码?
猜你喜欢
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2013-07-19
  • 2011-10-23
  • 1970-01-01
  • 2010-11-21
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多