简体   繁体   English

如何在JavaFX中的ListView内设置自定义控件的样式

[英]How to style custom control inside a ListView in JavaFX

I have created a custom control extending HBox: 我创建了一个扩展HBox:的自定义控件HBox:

FXML FXML

<fx:root alignment="CENTER_LEFT" prefHeight="80" prefWidth="400.0" spacing="5" styleClass="email-view"
         stylesheets="stylesheet.css" type="javafx.scene.layout.HBox" xmlns="http://javafx.com/javafx/8.0.112"
         xmlns:fx="http://javafx.com/fxml/1">
    <Region fx:id="unreadIndicator" prefWidth="5.0"/>
    <Label fx:id="senderAvatar" prefHeight="40.0" prefWidth="40.0" styleClass="sender-image-small"/>
    <Region prefWidth="10"/>
    <VBox prefHeight="200.0" prefWidth="100.0" HBox.hgrow="ALWAYS">
        <Region prefHeight="10"/>
        <HBox>
            <Label fx:id="fromLabel" styleClass="from-label">Anindya Chatterjee</Label>
            <Region HBox.hgrow="ALWAYS"/>
            <Label fx:id="dateLabel" styleClass="date-label">31st Dec 1999</Label>
            <Region prefWidth="5"/>
        </HBox>
        <Region prefHeight="5"/>
        <HBox>
            <Label fx:id="subjectLabel" styleClass="subject-label">Test Mail Subject</Label>
            <Region HBox.hgrow="ALWAYS"/>
            <ImageView fx:id="attachmentLabel" styleClass="attachment-label">
                <Image requestedHeight="15" requestedWidth="15" url="@attach.svg"/>
            </ImageView>
            <Region prefWidth="5"/>
        </HBox>
        <Region prefHeight="5"/>
        <HBox>
            <Label fx:id="contentLabel" styleClass="content-label" maxWidth="400">
                Here is some text for test mail just to check how does
                it look on mock ups. The final value will change
            </Label>
            <Region HBox.hgrow="ALWAYS"/>
            <ImageView fx:id="favoriteLabel" styleClass="favorite-label">
                <Image requestedHeight="15" requestedWidth="15" url="@favorite.svg"/>
            </ImageView>
            <Region minWidth="5"/>
        </HBox>
    </VBox>
</fx:root>

Java File Java文件

public class EmailView extends HBox {

    public Region unreadIndicator;
    public Label senderAvatar;
    public Label fromLabel;
    public Label dateLabel;
    public Label subjectLabel;
    public ImageView attachmentLabel;
    public Label contentLabel;
    public ImageView favoriteLabel;

    public EmailView() {
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(getClass().getClassLoader().getResource("email-view.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);
        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }
}

I am using the control as a list view item. 我将控件用作列表视图项。 I have made changes to the css property to change the select bar color and all as follows 我对css属性进行了更改,以更改选择栏的颜色,如下所示

.list-view, .list-view:focused, .list-view:selected {
    -fx-control-inner-background: transparent;
    -fx-control-inner-background-alt: -fx-control-inner-background;
    -fx-background-color: transparent;
    -fx-padding: 0;
    -fx-fit-to-width: true;
    -fx-effect: null;
    -fx-selection-bar: transparent;
    -fx-selection-bar-non-focused: transparent;
}

.list-view .list-cell:filled:selected:focused, .list-view .list-cell:filled:selected {
    -fx-background-color: transparent;
    -fx-effect: null;
}

.list-view .list-cell:filled:hover {
    -fx-background-color: transparent;
    -fx-effect: null;
}

.email-view {
    -fx-background-color: -color-quinary;
    -fx-effect: dropshadow(three-pass-box, -color-text-inverted, 4, 0, 0, 1);
}

Now I want to change the background color of the custom control when it is selected inside the list view. 现在,我想在列表视图中选择自定义控件时更改其背景颜色。 The effect I am try to achieve more or less like this 我尝试达到或多或少这样的效果

在此处输入图片说明

Any pointer how to achieve this effect using css preferably? 任何指针如何最好使用css实现这种效果?

Theoretically this set of selectors do the trick: 从理论上讲,这组选择器可以解决这个问题:

// Color of the list-cell selected + unselected: transparent
.list-view .list-cell,
.list-view .list-cell:filled,
.list-view .list-cell:selected,
.list-view .list-cell:focused,
 .list-view .list-cell:hover {
    -fx-background-color: transparent;
    -fx-effect: null;
}

// Color of the custom control hover
.list-view .list-cell:hover .email-view {
    -fx-background-color: greenyellow;
}

// Color of the custom control selected
.list-view .list-cell:filled:selected:focused .email-view,
.list-view .list-cell:filled:selected .email-view {
    -fx-background-color: green;
}

// Color of the custom control unselected
.email-view { -fx-background-color: gray; }

The goal is to kep the list-cell transparent all the time, and based on the pseudo-state of the list-cell set the background color of email-view . 目的是使list-cell始终保持透明,并基于list-cell的伪状态设置email-view的背景色。 Maybe I forgot about some state, but it could be a good starting point. 也许我忘记了某些状态,但这可能是一个很好的起点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM