JavaFX的ListView的选择栏的文本颜色使用CellFactory时(Javafx List

2019-07-29 23:07发布

有什么办法来改变在列表视图中选择栏的文本颜色? 最好使用CSS。 在TableView中,你可以使用:

-fx-selection-bar-text: white;

但是,这并不对一个ListView工作。

UPDATE:使用CellFactories时呈现细胞中的上述情况发生。

lvRooms.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
        @Override public ListCell<String> call(ListView<String> list) {
            return new RoomCell();
        }
    });

在细胞工厂类,选择该行的时候我会很乐意支付的情况。

但是:它一开始就称为一次,而不是每次选择杆移动,因此isSelected()方法总是呈现假。

更新2:这是RoomCell实现:

class RoomCell extends ListCell<String> {
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);

            if (item != null) {
                Log.debug("RoomCell called, item: "+item);
                final Label lbl = new Label(item); // The room name will be displayed here
                lbl.setFont(Font.font("Segoe UI", FontWeight.BOLD, 18));
                lbl.setStyle("-fx-text-fill: black");

                //lbl.setTextFill(isSelected()?Color.WHITE: Color.BLACK);
                if (isSelected())  // This is always false :(
                   lbl.setStyle("-fx-text-fill: yellow");

                if (Rooms.getBoolean(item, "OwnerStatus")) {
                    lbl.setEffect(new DropShadow(15, Color.BLUEVIOLET));
                    lbl.setGraphic(new ImageView(
                                    new Image(getClass().getResourceAsStream("images/universal.png"))));
                } else  {
                    lbl.setGraphic(new ImageView(
                                    new Image(getClass().getResourceAsStream("images/yin-yang.png"))));
                    lbl.setEffect(new DropShadow(15, Color.WHITE));
                } 
                setGraphic(lbl); 

            }
        }
    }

Answer 1:

-fx-selection-bar-text是在根默认CSS选择,这是的选择器所限定的彩色调色板(未CSS属性) Scene 。 我不知道你如何使用它,但如果你定义它(因为它是全球场景的选择),如:

.root{
    -fx-selection-bar-text: red;
}

在你的CSS文件,然后使用所有控件的CSS属性-fx-selection-bar-text将是红色。 ListView将受到影响(见下文注释掉原来的用途)。
不过,如果你希望只自定义ListView的风格,覆盖默认属性这样
(注:仅-fx-text-fill 。被重写原始值将被注释掉,其中-fx-selection-bar-text使用):

/* When the list-cell is selected and focused */
.list-view:focused .list-cell:filled:focused:selected {
    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar;
    -fx-background-insets: 0, 1, 2;
    -fx-background: -fx-accent;
    /* -fx-text-fill: -fx-selection-bar-text;  */
    -fx-text-fill: red;
}

/* When the list-cell is selected and selected-hovered but not focused. 
    Applied when the multiple items are selected but not focused */
.list-view:focused .list-cell:filled:selected, .list-view:focused .list-cell:filled:selected:hover {
    -fx-background: -fx-accent;
    -fx-background-color: -fx-selection-bar;
    /* -fx-text-fill: -fx-selection-bar-text;  */
    -fx-text-fill: green;
}

/* When the list-cell is selected, focused and mouse hovered */
.list-view:focused .list-cell:filled:focused:selected:hover {
    -fx-background: -fx-accent;
    -fx-background-color: -fx-focus-color, -fx-cell-focus-inner-border, -fx-selection-bar;
    -fx-background-insets: 0, 1, 2;
    /* -fx-text-fill: -fx-selection-bar-text;  */
    -fx-text-fill: yellow;
}

这些CSS属性,更是内置caspian.css avaliable。


更新:我强烈建议你阅读的细胞API 。 从那里

......我们代表只用很少的细胞非常大的数据集。 每个单元被“回收”,或重复使用。

被警告的不同的字符串项目可以使用相同的细胞,具有误导性的视觉效果/效果结束,就像isSelected()在你的代码。 此外,在API它说

因为迄今为止最常见用例细胞是显示文本到用户,该使用情况是专门为细胞内优化。 这是通过扩展从标记的细胞来完成。 这意味着Cell的子类只需要设置文本属性,而不是创建一个单独的标签,并设置在细胞内。

所以我重构你的代码如下。

class RoomCell extends ListCell<String> {
    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (item != null) {
            Log.debug("RoomCell called, item: "+item);
            setFont(Font.font("Segoe UI", FontWeight.BOLD, 18));
            ImageView iView = new ImageView();
            if (Rooms.getBoolean(item, "OwnerStatus")) {
                iView.setEffect(new DropShadow(15, Color.BLUEVIOLET));
                iView.setImage(new Image(getClass().getResourceAsStream("images/universal.png")));
            } else  {
                iView.setEffect(new DropShadow(15, Color.WHITE));
                iView.setImage(new Image(getClass().getResourceAsStream("images/yin-yang.png")));
            } 
            setGraphic(iView);  // The image will be displayed here
            setText(item); // The room name will be displayed here
        }
    }
}

所有-fx-text-fill样式的单元格文本将根据CSS文件中定义的改变。

现在,这里是小区的文字阴影效果的影响,并从CSS文件其填充颜色之间的权衡:
- 如果你想使用阴影效果的影响,你应该去喜欢目前的方式,即创建标签,设置它的文字,给标签和setGraphic(标签)dorpshadow效果。 然而,这时候你会不喜欢设置文本( setText(item)细胞),因此在CSS文件中的文本颜色样式不会有任何效果。
-在另一方面,如果你喜欢,我已经重构,那么你应该禁用代码-fx-background-color细胞(延伸Labeled将其设置为) transparentnull ,并设置-fx-effect来阴影效果的CSS文件,以便能够阴影效果好坏直接应用于文本。 清除单元格的背景是也不IMO的首选方式。 通过代码的解释:

Label lbl = new Label("This text will have a dropshadow on itself directly");
lbl.setEffect(new DropShadow(15, Color.BLUE));

Label another_lbl = new Label("This text will have a dropshadow applied on the background bounds, not to text");
another_lbl.setEffect(new DropShadow(15, Color.BLUE));
another_lbl.setStyle("-fx-background-color:gray");

测试他们看到了差距。 就这样。



文章来源: Javafx ListView selection bar text color when using CellFactory