JavaFX CSS не работает при использовании fx: factory для заполнения пользовательского компонента GridPane - PullRequest
0 голосов
/ 28 сентября 2018

У меня проблема с CSS для компонента, когда используется fx:factory, дополнительное свойство gridLinesVisible, похоже, тоже не работает.Позвольте мне перейти к сути, мой компонент выглядит так:

<?import javafx.scene.layout.GridPane?>
<fx:root type="javafx.scene.layout.GridPane" xmlns="http://javafx.com/javafx/8"
         xmlns:fx="http://javafx.com/fxml/1" maxWidth="400.0" prefWidth="220.0"
         stylesheets="@custom.css" styleClass="grid" gridLinesVisible="true">
</fx:root>

И я использую его так:

<MyCustomView fx:id="myCustomView" prefHeight="240.0" rotate="-90" alignment="CENTER"
                    fx:factory="createMyCustomView"/>

И код для фабричного метода выглядит так:

public static MyCustomView createMyCustomView() {
    ObservableList<RowView> rowViews = FXCollections.observableArrayList();
    for (int i = 0; i < 20; i++) {
        RowView rv = new RowView();
        rv.setRow(i);
        rowViews.add(rv);
    }
    MyCustomView view = new MyCustomView();
    view.setRows(rowviews);
    return view;
}

Я попытался установить таблицы стилей и styleClass в конструкторе, фабричном методе, контроллере и FXML, но ничего не работает.Но когда я убираю вызов fx:factory="createMyCustomView" CSS и свойство gridLinesVisible работают.У меня нет больше идей, чтобы попробовать.

Приветствия, Рафал

РЕДАКТИРОВАТЬ

Я немного изменил проект;вот my_custom_view.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.collections.FXCollections?>
<?import sample.RowView?>
<fx:root type="sample.MyCustomView" xmlns="http://javafx.com/javafx/8"
         xmlns:fx="http://javafx.com/fxml/1" maxWidth="400.0" prefWidth="250.0"
         stylesheets="@custom.css" styleClass="grid" gridLinesVisible="true">
    <rows>
        <!--If using views defined inside the view gridlines and css work-->
        <FXCollections fx:factory="observableArrayList">
            <RowView row="1"/>
            <RowView row="2"/>
            <RowView row="3"/>
            <RowView row="4"/>
            <RowView row="5"/>
            <RowView row="6"/>
            <RowView row="7"/>
            <RowView row="8"/>
        </FXCollections>
    </rows>
</fx:root>

Вот класс MyCustomView:

package sample;

import javafx.beans.property.BooleanProperty;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXMLLoader;
import javafx.scene.Group;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;

import java.io.IOException;
import java.lang.ref.WeakReference;

    public class MyCustomView extends GridPane {

        private static final String FXML_RESOURCE_PATH = "my_custom_view.fxml";

        public MyCustomView() {
            FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource(FXML_RESOURCE_PATH));
            fxmlLoader.setRoot(this);
            fxmlLoader.setController(this);

            try {
                fxmlLoader.load();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }

        private void insertRowsAndLabels() {
            this.getChildren().clear();
            if (rows.get() != null) {
                for (RowView rv : rows.get()) {
                    Label label = new Label(String.valueOf(rv.getRow()));
                    Group group = new Group(label);
                    group.setRotate(90);
                    this.add(group, 1, rv.getRow());
                    this.add(rv, 0, rv.getRow());
                }
            }
        }

        public final ObjectProperty<ObservableList<RowView>> rowsProperty() {
            return rows;
        }

        private ObjectProperty<ObservableList<RowView>> rows =
                new SimpleObjectProperty<ObservableList<RowView>>(this, "rows") {

                    WeakReference<ObservableList<RowView>> oldItemsRef;

                    @Override
                    protected void invalidated() {
                        final ObservableList<RowView> oldItems = oldItemsRef == null ? null : oldItemsRef.get();
                        final ObservableList<RowView> newItems = getRows();

                        // Fix for RT-36425
                        if (newItems != null && newItems == oldItems) {
                            return;
                        }

                        oldItemsRef = new WeakReference<>(newItems);
                    }
                };

        public final void setRows(ObservableList<RowView> value) {
            rowsProperty().set(value);
            insertRowsAndLabels();
        }

        public final ObservableList<RowView> getRows() {
            return rows.get();
        }

        public final BooleanProperty autoFillProperty() {
            if (autoFill == null) {
                autoFill = new SimpleBooleanProperty(this, "autoFill", false);
            }
            return autoFill;
        }

        private BooleanProperty autoFill;

        public boolean getAutoFill() {
            return autoFillProperty().get();
        }

        public void setAutoFill(boolean value) {
            autoFillProperty().set(value);
        }

        public static MyCustomView createMyCustomView() {
            ObservableList<RowView> rowViews = FXCollections.observableArrayList();
            for (int i = 0; i < 20; i++) {
                RowView rv = new RowView();
                rv.setRow(i);
                rowViews.add(rv);
            }
            MyCustomView view = new MyCustomView();
            view.setRows(rowViews);
            return view;
        }
        }

Вот основной файл FXML вида, sample.fxml:

<?import javafx.collections.FXCollections?>
<?import javafx.scene.layout.VBox?>
<?import sample.MyCustomView?>
<?import sample.RowView?>
<VBox fx:controller="sample.Controller"
      xmlns:fx="http://javafx.com/fxml"
      stylesheets="@custom.css">

    <!--GridLines and css don't work here-->
    <MyCustomView styleClass="grid" prefHeight="240.0" rotate="-90" alignment="CENTER"
                  fx:factory="createMyCustomView"/>
    <!--GridLines and css don't work here-->
    <MyCustomView styleClass="grid" prefHeight="240.0" rotate="-90" alignment="CENTER"
                  gridLinesVisible="true">
        <rows>
            <FXCollections fx:factory="observableArrayList">
                <RowView row="1" rowName="test"/>
                <RowView row="2" rowName="test"/>
                <RowView row="3" rowName="test"/>
                <RowView row="4" rowName="test"/>
                <RowView row="5" rowName="test"/>
            </FXCollections>
        </rows>
    </MyCustomView>

    <!--This works-->
    <MyCustomView prefHeight="240.0" rotate="-90" alignment="CENTER"/>
</VBox>

Я загрузил всекод для github https://github.com/spajo/ProblemExample

...