Listview JavaFx列表视图为列表单元格着色

Listview JavaFx列表视图为列表单元格着色,listview,user-interface,javafx,listcellrenderer,Listview,User Interface,Javafx,Listcellrenderer,我有一个标签列表视图,我想在运行时给列表单元格上色。问题是我想用颜色填充整个单元格,而不仅仅是标签的背景。在Java/CSS中有没有办法做到这一点?了解ListView单元格着色的动态特性 通常情况下,内部单元格颜色会根据多种情况发生变化: 单元格是奇数行还是偶数行(偶数行背景较浅) 是否选择该行 根据控件是否具有焦点,选定行具有不同的颜色(聚焦选定行为蓝色,未聚焦选定行为灰色) 因此,由于单元格颜色可以根据状态而更改,因此在为单元格设置自定义颜色时,需要决定是否要保留此行为 样品溶液 下面是一

我有一个标签列表视图,我想在运行时给列表单元格上色。问题是我想用颜色填充整个单元格,而不仅仅是标签的背景。在Java/CSS中有没有办法做到这一点?

了解ListView单元格着色的动态特性

通常情况下,内部单元格颜色会根据多种情况发生变化:

  • 单元格是奇数行还是偶数行(偶数行背景较浅)
  • 是否选择该行
  • 根据控件是否具有焦点,选定行具有不同的颜色(聚焦选定行为蓝色,未聚焦选定行为灰色)
  • 因此,由于单元格颜色可以根据状态而更改,因此在为单元格设置自定义颜色时,需要决定是否要保留此行为

    样品溶液

    下面是一个示例,它将根据列表项是否符合条件将单元格颜色设置为淡绿色(在本例中,出于测试目的,硬编码为以字母“J”开头的名称)

    导入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);
    }
    }
    
    需要注意的一些事项:

  • 自定义单元渲染通过ListView的自定义单元工厂完成
  • 单元格工厂返回的单元格,根据单元格状态设置
    -fx控件内部背景
    查找的CSS颜色。如果您不知道查找颜色是什么,请在中查找,并查看Java安装附带的jfxrt.jar文件中的
    modena.css
    文件
  • 默认的单元格渲染机制将稍微变暗或变亮ListView中的偶数行和奇数行,即使是基于您的自定义颜色
  • 该示例仅为非选定行设置自定义颜色。对于选定行,保留默认的蓝色和灰色。因此,该示例并不全面,但希望能为您提供足够的信息,以实现您的目标
  • 该示例在代码中对默认颜色和自定义颜色进行编码,但更大的应用程序最好在单独的用户CSS样式表中定义这些颜色
  • 了解ListView单元格着色的动态特性

    通常情况下,内部单元格颜色会根据多种情况发生变化:

  • 单元格是奇数行还是偶数行(偶数行背景较浅)
  • 是否选择该行
  • 根据控件是否具有焦点,选定行具有不同的颜色(聚焦选定行为蓝色,未聚焦选定行为灰色)
  • 因此,由于单元格颜色可以根据状态而更改,因此在为单元格设置自定义颜色时,需要决定是否要保留此行为

    样品溶液

    下面是一个示例,它将根据列表项是否符合条件将单元格颜色设置为淡绿色(在本例中,出于测试目的,硬编码为以字母“J”开头的名称)

    导入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("");