Listview JavaFx列表视图为列表单元格着色
我有一个标签列表视图,我想在运行时给列表单元格上色。问题是我想用颜色填充整个单元格,而不仅仅是标签的背景。在Java/CSS中有没有办法做到这一点?了解ListView单元格着色的动态特性 通常情况下,内部单元格颜色会根据多种情况发生变化:Listview JavaFx列表视图为列表单元格着色,listview,user-interface,javafx,listcellrenderer,Listview,User Interface,Javafx,Listcellrenderer,我有一个标签列表视图,我想在运行时给列表单元格上色。问题是我想用颜色填充整个单元格,而不仅仅是标签的背景。在Java/CSS中有没有办法做到这一点?了解ListView单元格着色的动态特性 通常情况下,内部单元格颜色会根据多种情况发生变化: 单元格是奇数行还是偶数行(偶数行背景较浅) 是否选择该行 根据控件是否具有焦点,选定行具有不同的颜色(聚焦选定行为蓝色,未聚焦选定行为灰色) 因此,由于单元格颜色可以根据状态而更改,因此在为单元格设置自定义颜色时,需要决定是否要保留此行为 样品溶液 下面是一
导入javafx.application.application;
导入javafx.collections.*;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类ColoredList扩展了应用程序{
私有静态最终ObservableList数据=FXCollections.observableArrayList(
“吉尔”,
“杰克”,
“汤姆”,
“哈利”,
“珍妮”
);
私有静态最终字符串DEFAULT_CONTROL_internal_BACKGROUND=“派生(-fx base,80%)”;
私有静态最终字符串突出显示\u CONTROL\u internal\u BACKGROUND=“派生(palegreen,50%)”;
@凌驾
public void start(Stage)引发异常{
ListView ListView=新的ListView(数据);
setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView参数){
返回新的ListCell(){
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(空);
setStyle(“-fx控件内部背景:“+默认控件内部背景+”;”;
}否则{
setText(项目);
如果(项目开始时带有(“J”)){
setStyle(“-fx控件内部背景:“+高亮显示的控件内部背景+”;”;
}否则{
setStyle(“-fx控件内部背景:“+默认控件内部背景+”;”;
}
}
}
};
}
});
VBox布局=新的VBox(列表视图);
布局。设置填充(新插图(10));
舞台场景(新场景(布局));
stage.show();
}
公共静态void main(字符串[]args){
启动(ColoredList.class);
}
}
需要注意的一些事项:
-fx控件内部背景查找的CSS颜色。如果您不知道查找颜色是什么,请在中查找,并查看Java安装附带的jfxrt.jar文件中的modena.css
文件
导入javafx.application.application;
导入javafx.collections.*;
导入javafx.geometry.Insets;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
导入javafx.util.Callback;
公共类ColoredList扩展了应用程序{
私有静态最终ObservableList数据=FXCollections.observableArrayList(
“吉尔”,
“杰克”,
“汤姆”,
“哈利”,
“珍妮”
);
私有静态最终字符串DEFAULT_CONTROL_internal_BACKGROUND=“派生(-fx base,80%)”;
私有静态最终字符串突出显示\u CONTROL\u internal\u BACKGROUND=“派生(palegreen,50%)”;
@凌驾
public void start(Stage)引发异常{
ListView ListView=新的ListView(数据);
setCellFactory(新回调(){
@凌驾
公共ListCell调用(ListView参数){
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);
}
}
if(getIndex() % 2 == 1)
setStyle("-fx-background-color: #AAAAAA");
else
setStyle("");