Tableview行样式

时间:2014-11-19 11:40:43

标签: javafx javafx-8

我有一个我想要应用的tableview取决于行项不同样式的值。

例如:

每行代表一个拥有财产年的人,所以如果人< 18年,行颜色应为红色。如果是人> 60年,行颜色应该是绿色的......

我在SO上搜索关于行的应用样式,但大多数情况下尝试应用于选定的行,而其他情况则使用cellfactories(我不知道是否可以设置整行的样式,或者我需要为每个行应用样式字段)。

1 个答案:

答案 0 :(得分:2)

只需设置一个行工厂。管理样式的最佳方法是使用CSS PseudoClasss。在你的例子中,你可以有一个用于“年轻”,一个用于“旧”:

PsuedoClass old = PseudoClass.getPseudoClass("old");
PsuedoClass young = PseudoClass.getPseudoClass("young");
tableView.setRowFactory(tv -> {
    TableRow<Person> row = new TableRow<>();
    ChangeListener<Number> yearsListener = (obs, oldAge, newAge) -> {
        int age = newAge.intValue();
        row.pseudoClassStateChanged(old, age > 60);
        row.pseudoClassStateChanged(young, age < 18);
    };
    row.itemProperty().addListener((obs, previousPerson, currentPerson) -> {
        if (previousPerson != null) {
            previousPerson.yearsProperty().removeListener(yearsListener);
        }
        if (currentPerson != null) {
            currentPerson.yearsProperty().addListener(yearsListener);
            row.pseudoClassStateChanged(old, currentPerson.getYears() > 60);
            row.pseudoClassStateChanged(young, currentPerson.getYears() < 18);
        } else {
            row.pseudoClassStateChanged(old, false);
            row.pseudoClassStateChanged(young, false);
        }
    });
    return row ;
});

如果您知道每个Person的年份是固定的(即在显示表格时它们不会改变),您可以将其简化为

PsuedoClass old = PseudoClass.getPseudoClass("old");
PsuedoClass young = PseudoClass.getPseudoClass("young");
tableView.setRowFactory(tv -> {
    TableRow<Person> row = new TableRow<>();
    row.itemProperty().addListener((obs, previousPerson, currentPerson) -> {
        if (currentPerson != null) {
            row.pseudoClassStateChanged(old, currentPerson.getYears() > 60);
            row.pseudoClassStateChanged(young, currentPerson.getYears() < 18);
        } else {
            row.pseudoClassStateChanged(old, false);
            row.pseudoClassStateChanged(young, false);
        }
    });
    return row ;
});

现在应用样式只需创建一个包含所需样式的外部样式表:

.table-row-cell:young {
    -fx-background: green ;
}
.table-row-cell:old {
    -fx-background: blue ;
}