JavaFx 列表视图为列表单元格着色
JavaFx list View coloring the list cell
我有一个标签列表视图,我想在 运行 时间给列表单元格着色。问题是我想用颜色填充整个单元格,而不仅仅是标签的背景。 Java/CSS有办法吗?
了解 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);
}
}
一些注意事项:
- 自定义单元格呈现是通过 ListView 的自定义单元格工厂完成的。
- 细胞工厂返回的细胞,根据细胞状态设置
-fx-control-inner-background
查找CSS颜色。如果您不知道查找的颜色是什么,请在 JavaFX CSS reference guide 中查找并查看 [=57] 附带的 jfxrt.jar 文件中的 modena.css
文件=] 安装。
- 默认的单元格渲染机制会使 ListView 中的偶数行和奇数行稍微变暗或变亮,甚至基于您的自定义颜色。
- 示例仅为未选中的行设置自定义颜色。对于选定的行,将保留默认的蓝色和灰色。因此示例并不全面,但希望能为您提供足够的信息来完成您想要的。
- 该示例在代码中对默认颜色和自定义颜色进行编码,但较大的应用程序最好在单独的用户 CSS 样式表中定义这些颜色。
在您的细胞工厂的 updateItem
函数中,只需使用以下行:
if(getIndex() % 2 == 1)
setStyle("-fx-background-color: #AAAAAA");
else
setStyle("");
我有一个标签列表视图,我想在 运行 时间给列表单元格着色。问题是我想用颜色填充整个单元格,而不仅仅是标签的背景。 Java/CSS有办法吗?
了解 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);
}
}
一些注意事项:
- 自定义单元格呈现是通过 ListView 的自定义单元格工厂完成的。
- 细胞工厂返回的细胞,根据细胞状态设置
-fx-control-inner-background
查找CSS颜色。如果您不知道查找的颜色是什么,请在 JavaFX CSS reference guide 中查找并查看 [=57] 附带的 jfxrt.jar 文件中的modena.css
文件=] 安装。 - 默认的单元格渲染机制会使 ListView 中的偶数行和奇数行稍微变暗或变亮,甚至基于您的自定义颜色。
- 示例仅为未选中的行设置自定义颜色。对于选定的行,将保留默认的蓝色和灰色。因此示例并不全面,但希望能为您提供足够的信息来完成您想要的。
- 该示例在代码中对默认颜色和自定义颜色进行编码,但较大的应用程序最好在单独的用户 CSS 样式表中定义这些颜色。
在您的细胞工厂的 updateItem
函数中,只需使用以下行:
if(getIndex() % 2 == 1)
setStyle("-fx-background-color: #AAAAAA");
else
setStyle("");