css - 如何在 javaFX CSS 中选择 .list-cell

标签 css javafx

有人能告诉我,我如何设计 1 ListView 的列表单元格吗?

我有两个 ListView。 id="#one"和 id="#two"的一个。

现在我想为每个 ListView 的列表单元格设置不同的样式。

.list-cell {
    -fx-text-fill: rgba(16, 27, 49, 0.8);
    -fx-background-color: transparent;
}

这是涵盖所有列表单元格的“.list-cell”。但我不想这样。

这是我尝试过的:

#one.list-view.list-cell
#one.list-view > list-cell
#one > list-view > list-cell
#one > list-view.list-cell
#one .list-view .list-cell
#one.list-cell
#one > list-cell
#one .list-cell
#one > .list-cell

没有任何作用。

现在这是在浪费时间。 CSS 是否在 JavaFX 中工作?我不想使用代码来设置元素样式。

最佳答案

JavaFX 的外部 CSS 文件中的选择器遵循与 HTML 中的 CSS 相同的结构规则。

基本上:

#name

选择任何具有 id name

的节点
.name

选择具有 CSS 类 name 的任何节点

两个没有空格连接的选择器选择匹配两个选择器的任何单个节点,所以

#one.list-cell

只有当它的 ID 为 one 并且具有 CSS 类 list-cell 等时才会选择一个节点

selector1 > selector2

选择匹配 selector2 的节点,该节点是匹配 selector1 的节点的直接子节点,所以

#one > .list-cell

选择具有 CSS 类 list-cell 的任何节点,该节点是 ID 为 one 的节点的直接子节点。

最后,

selector1 selector2

选择任何匹配 selector2 的节点,它是匹配 selector1 的节点的后代,所以

#one .list-cell

选择具有 CSS 类 list-cell 的任何节点,该节点是 ID 为 one 的节点的后代(直接或非直接)。

引用JavaFX CSS documentation for ListView ,您可以看到 ListView 具有 ListCell 作为非直接后代。准确地说,它有一个 CSS 类 virtual-flow 的 child ,而后者又有一个 CSS 类 clipped-container 的 child ,后者有 ListCell 子级,它们具有以下所有 CSS 类:cellindexed-celllist-cell

因此,如果您的 ListView 有一个 id one,那么您可以使用

选择单元格
#one .list-cell

#one > .virtual-flow > .clipped-container > .list-cell

(后者可能会表现得更好,因为 CSS 引擎不必在场景图层次结构中任意搜索;但是第一个版本将足以满足几乎所有用例)。

这是一个 SSCCE:

import java.util.stream.IntStream;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MultipleListViewStyleTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        ListView<String> firstList = new ListView<>();
        ListView<String> secondList = new ListView<>();

        firstList.setId("one");
        secondList.setId("two");

        IntStream.rangeClosed(1, 20).mapToObj(i -> "Item "+i).forEach(s -> {
            firstList.getItems().add(s);
            secondList.getItems().add(s);
        });

        HBox root = new HBox(10, firstList, secondList);
        root.setPadding(new Insets(20));
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 600, 600);
        scene.getStylesheets().add("multiple-list-view-style-test.css");

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

多 ListView 样式测试.css:

#one .list-cell {
    -fx-text-fill: rgba(16, 24, 49, 0.8);
    -fx-background-color: transparent;
}

#two .list-cell {
    -fx-text-fill: blue ;
}

关于css - 如何在 javaFX CSS 中选择 .list-cell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32007318/

相关文章:

html - 如何跨越表格的标题以跨越 HTML5 中的列

css - 为移动访问者制作菜单棒?

JavaFX,为什么锚定 Pane 中的像素值是双倍的?例如,如果输入 10.5 会发生什么?

html - css 复选框在 :checked state 时不应用更改

javascript - css 行高 : number to px

JavaFX - 如何同步CustomTab(扩展Tab)和TabPane

listview - 在 javafx 中删除 ListView 上的选定项目

java - 产生其他服务/任务的后台服务

jquery - 没有外部内容的无限滚动

java - 根据 ArrayList 中存储的数据制作 CandleStick 图表动画