我有一个标签的列表视图,我想在运行时为列表单元格着色。问题是我想用不仅是Label的背景颜色填充整个Cell。有没有办法在Java / CSS中做到这一点?
答案 0 :(得分:4)
了解ListView单元格着色的动态特性
通常情况下,内部细胞颜色会根据许多因素而变化:
因为单元格颜色可以根据状态而改变,所以在为单元格设置自定义着色时,需要决定是否要保留此行为。
示例解决方案
这是一个将单元格颜色设置为淡绿色的示例,具体取决于列表项是否与条件匹配(在这种情况下,为了测试目的而硬编码为以字母“J”开头的名称)。
import javafx.application.Application;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class ColoredList extends Application {
private static final ObservableList<String> data = FXCollections.observableArrayList(
"Jill",
"Jack",
"Tom",
"Harry",
"Jenney"
);
private static final String DEFAULT_CONTROL_INNER_BACKGROUND = "derive(-fx-base,80%)";
private static final String HIGHLIGHTED_CONTROL_INNER_BACKGROUND = "derive(palegreen, 50%)";
@Override
public void start(Stage stage) throws Exception {
ListView<String> listView = new ListView<>(data);
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> param) {
return new ListCell<String>() {
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setStyle("-fx-control-inner-background: " + DEFAULT_CONTROL_INNER_BACKGROUND + ";");
} else {
setText(item);
if (item.startsWith("J")) {
setStyle("-fx-control-inner-background: " + HIGHLIGHTED_CONTROL_INNER_BACKGROUND + ";");
} else {
setStyle("-fx-control-inner-background: " + DEFAULT_CONTROL_INNER_BACKGROUND + ";");
}
}
}
};
}
});
VBox layout = new VBox(listView);
layout.setPadding(new Insets(10));
stage.setScene(new Scene(layout));
stage.show();
}
public static void main(String[] args) {
launch(ColoredList.class);
}
}
有些注意事项:
-fx-control-inner-background
查找的CSS颜色。如果您不知道查找的颜色是什么,请在JavaFX CSS reference guide中查找并查看Java安装附带的jfxrt.jar文件中的modena.css
文件。答案 1 :(得分:0)
在单元工厂的updateItem
函数中,只需使用以下几行:
if(getIndex() % 2 == 1)
setStyle("-fx-background-color: #AAAAAA");
else
setStyle("");