在JFXListView中使用单元工厂忽略了JFoenix样式

时间:2018-05-11 17:27:21

标签: listview javafx kotlin javafx-8 jfoenix

使用JFoenix控件JFXListView时,如果我使用单元工厂,则无法将材质样式指定给列表。如何使用单元工厂并同时指定.jfx-list-cell-container { -fx-alignment: center-left; } .jfx-list-cell-container > .label { -fx-text-fill: BLACK; } .jfx-list-cell:odd:selected > .jfx-rippler > StackPane, .jfx-list-cell:even:selected > .jfx-rippler > StackPane { -fx-background-color: rgba(0, 0, 255, 0.2); } .jfx-list-cell { -fx-background-insets: 0.0; -fx-text-fill: BLACK; } .jfx-list-cell:odd, .jfx-list-cell:even { -fx-background-color: WHITE; } .jfx-list-cell:filled:hover { -fx-text-fill: black; } .jfx-list-cell .jfx-rippler { -jfx-rippler-fill: BLUE; } .jfx-list-view { -fx-background-insets: 0; -jfx-cell-horizontal-margin: 0.0; -jfx-cell-vertical-margin: 5.0; -jfx-vertical-gap: 10; -jfx-expanded: false; -fx-pref-width: 200; } 控件的样式?

这是我的最小,完整和可验证的例子:

demoStyle.css (摘自JFoenix演示)

<?import com.jfoenix.controls.JFXListView?>
<?import javafx.scene.layout.HBox?>
<HBox
        xmlns="http://javafx.com/javafx/8.0.112"
        xmlns:fx="http://javafx.com/fxml"
        fx:controller="<some>.<valid>.<package>.<structure>.DemoController"
        minWidth="Infinity"
        minHeight="Infinity"
>
    <JFXListView fx:id="jfoenixListViewPlain"/>

    <JFXListView fx:id="jfoenixListViewWithCustomCell"/>
</HBox>

demoLayout.fxml

import com.jfoenix.controls.JFXListView
import javafx.application.Application
import javafx.collections.FXCollections
import javafx.fxml.FXML
import javafx.fxml.FXMLLoader
import javafx.fxml.Initializable
import javafx.scene.Scene
import javafx.scene.control.ContentDisplay
import javafx.scene.control.Label
import javafx.scene.control.ListCell
import javafx.scene.layout.HBox
import javafx.scene.paint.Color
import javafx.stage.Stage
import java.net.URL
import java.util.*

data class MyCustomData(val text: String)

class DemoController : Initializable
{
    internal class MyCustomCell : ListCell<MyCustomData>()
    {
        init
        {
            text = null
            contentDisplay = ContentDisplay.GRAPHIC_ONLY
        }

        override fun updateItem(item: MyCustomData?, empty: Boolean)
        {
            super.updateItem(item, empty)

            graphic =
                    if (empty || item == null)
                    {
                        null
                    }
                    else
                    {
                        // In practice this isn't a Label but a Pane with multiple children
                        Label().apply { text = item.text }
                    }
        }
    }

    @FXML
    private lateinit var jfoenixListViewPlain: JFXListView<String>

    @FXML
    private lateinit var jfoenixListViewWithCustomCell: JFXListView<MyCustomData>


    override fun initialize(location: URL?, resources: ResourceBundle?)
    {
        val plainList = FXCollections.observableArrayList("A", "B", "C")
        jfoenixListViewPlain.items = plainList

        val customItemsList = FXCollections.observableArrayList(MyCustomData("A"), MyCustomData("B"), MyCustomData("C"))
        jfoenixListViewWithCustomCell.items = customItemsList
        jfoenixListViewWithCustomCell.setCellFactory { MyCustomCell() }
    }
}

class MainDemoClass : Application()
{
    companion object
    {
        @JvmStatic
        fun main(args: Array<String>)
        {
            Application.launch(MainDemoClass::class.java, *args)
        }
    }

    @Throws(Exception::class)
    override fun start(stage: Stage)
    {
        val loader = FXMLLoader(javaClass.getResource("/layouts/demoLayout.fxml"))
        val root = loader.load<HBox>()

        with(stage)
        {
            title = "Test's Title"
            scene =
                    Scene(root, 600.0, 600.0, Color.WHITE).apply {
                        with(stylesheets)
                        {
                            add(MainDemoClass::class.java.getResource("/css/jfoenix-design.css").toExternalForm())
                            add(MainDemoClass::class.java.getResource("/css/demoStyle.css").toExternalForm())
                        }
                    }

            isResizable = false
            show()
        }
    }
}

Demo.kt

{{1}}

1 个答案:

答案 0 :(得分:-1)

更改internal class MyCustomCell : ListCell<MyCustomData>() internal class MyCustomCell : JFXListCell<MyCustomData>()