热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JavaFxlistView为列表单元着色

如何解决《JavaFxlistView为列表单元着色》经验,为你挑选了1个好方法。

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



1> jewelsea..:

了解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 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 listView = new ListView<>(data);
        listView.setCellFactory(new Callback, ListCell>() {
            @Override
            public ListCell call(ListView param) {
                return new ListCell() {
                    @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参考指南中查找modena.css该颜色,然后查看Java安装随附的jfxrt.jar文件中的文件。

    默认的单元格渲染机制即使基于自定义颜色,也会使ListView中的偶数和奇数行稍微变暗或变亮。

    该示例仅为未选择的行设置自定义颜色。对于选定的行,保留默认的蓝色和灰色。因此,该示例并不全面,但是希望为您提供足够的信息来完成您想要的。

    该示例使用代码对默认颜色和自定义颜色进行了编码,但是较大的应用最好在单独的用户CSS样式表中进行定义。


推荐阅读
author-avatar
老黑_微笑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有