【问题标题】:Get particular row of tableView item which has some condition (JavaFX)获取具有某些条件的 tableView 项目的特定行(JavaFX)
【发布时间】:2018-03-22 21:33:45
【问题描述】:

我正在为一个人制作出勤表视图。我正在获取 tableView 行,如果该特定日期的人的状态为“存在”(字符串),那么我想更改该 particular 行并将其背景颜色更改为绿色。

然后,如果他在那个特定天“缺席”,我想更改该行并设置红色背景。

否则,如果行中没有日期和状态,我需要再次更改行并设置白色背景。

问题:它正在经历第一个 if 语句,然后将每一行设置为绿色,因为第一个语句是“true”。

我只想获取存在的行并将该行设置为绿色背景色。

*getStatus 返回字符串

studentTable.setRowFactory(tableView -> {
    final TableRow<Attendance> row = new TableRow<>();

        for (Attendance item : studentTable.getItems()) {
            if (item.getStatus().equals("present")) {
                row.setStyle("-fx-background-color:green;");
            }
            else if (item.getStatus().equals("absent")){
                row.setStyle("-fx-background-color:red;");
            }
            else {
                row.setStyle("-fx-background-color:white;");
            }
        }
return row;
    });
}

带有结果的图片:Image

我将感谢任何解决方案和任何帮助:)

【问题讨论】:

标签: java uitableview javafx row


【解决方案1】:

您的代码所做的只是在需要时创建一个TableRow,然后每次创建一个TableRow,它都会遍历表中的所有项,不断改变其样式单行。因此,该行将简单地具有由表项目列表中的最后一项确定的样式(因为该项目决定了对setStyle(...) 的最终调用)。当然,您对创建的每一行都执行此操作,因此每一行都具有相同的样式也就不足为奇了。

TableRowupdateItem(...) 方法在第一次用于显示Attendance 实例时调用,并且在任何时候再次使用该行来显示不同的Attendance 实例时调用。因此,您需要覆盖 updateItem() 并将逻辑放在那里。

studentTable.setRowFactory(tableView -> new TableRow<Attendance>() {
    @Override
    protected void updateItem(Attendance attendance, boolean empty) {
        super.updateItem(attendance, empty);
        if (empty) {
            setStyle("");
        } else if (attendance.getStatus().equals("present")) {
            setStyle("-fx-background-color:green;");
        } else if (attendance.getStatus().equals("absent")) {
            setStyle("-fx-background-color:red;");
        } else {
            setStyle("-fx-background-color:white;");
        }
    }
});

【讨论】:

  • 对不起詹姆斯,但我还是初学者,你能编辑你的代码以便我可以实现吗? :/ 使用我的 for-each 循环或行字段。我试过了,但我想我做不到。非常感谢您的帮助和时间。
  • @MapeSVK 我发布的代码有什么问题?您不能通过循环来执行此操作,因为没有可迭代的 TableRows 集合。通常,表中的每个项目甚至都没有 TableRow 实例(这首先是表视图的全部要点)
  • 我不知道该放在哪里。我只有“item”字段,它是 for-each 循环的一部分,还有“row”字段,它是 tableView 中的行名。现在你使用这两个词没有先声明这些字段。
  • @MapeSVK 啊,我明白了。我复制了你的一些代码,但没有更新它以匹配我输入的部分。现在应该可以了。
  • 谢谢詹姆斯!现在我也明白它是如何工作的了。
猜你喜欢
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多