Как использовать свойство Vgrow ВСЕГДА в javafx CSS - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть табличное представление в javafx scene-builder.Я хочу использовать свойство Vgrow ALWAYS используя css.Мой вид таблицы находится в пределах HBox.Строитель сцены позволяет мне использовать это свойство.как показано.

enter image description here

Но как мне это сделать, используя CSS.Пожалуйста, помогите мне.

Я пробовал это в css таким образом

-fx-Vgrow: ALWAYS;

/* also */

Vgrow: ALWAYS;

ничего не работает.любая помощь?

1 Ответ

0 голосов
/ 07 декабря 2018

Просто для того, чтобы сделать его настраиваемым с помощью CSS, вы думаете о большой работе над вашими элементами управления.Вся необходимая мета-реализация css определяется на уровне суперкласса (поэтому большая часть метаданных css определяется в классе Region).Поскольку все элементы управления javafx являются подклассом Region, они удовлетворяют всем свойствам метаданных css, установленным в Region.

Если вы хотите иметь свои собственные метаданные css, то вы должны определить explicity для каждого икаждый контроль, который вы хотите иметь.(что опять-таки большая работа).

Я НЕ говорю, что это невозможно.Ниже приведен демонстрационный код для настраиваемого ScrollPane, включающий vgrow и hgrow в качестве мета-свойств css.И это прекрасно работает!Просто представьте, что если вам нужна описанная ниже функция для всех элементов управления, вам нужно настроить каждый элемент управления, который вы хотите настроить с помощью css;).

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class CustomCSSPropertyDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        VBox root = new VBox();
        root.setPadding(new Insets(15));
        root.setSpacing(15);
        Scene sc = new Scene(root, 600, 600);
        sc.getStylesheets().add(getClass().getResource("custom.css").toString());
        stage.setScene(sc);
        stage.show();

        Label label = new Label("Testing");
        MyScrollPane scrollPane = new MyScrollPane();
        scrollPane.getStyleClass().add("myclass");
        root.getChildren().addAll(label,scrollPane);
    }

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

Код файла css:

.myclass{
   -fx-vgrow-policy:always;
}

И настраиваемый элемент управления ScrollPane:

import com.sun.javafx.css.converters.EnumConverter;
import javafx.beans.property.ObjectProperty;
import javafx.css.CssMetaData;
import javafx.css.Styleable;
import javafx.css.StyleableObjectProperty;
import javafx.css.StyleableProperty;
import javafx.scene.control.Control;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MyScrollPane extends ScrollPane {
    private ObjectProperty<Priority> hgrowPolicy;
    private ObjectProperty<Priority> vgrowPolicy;

    public final void setHgrowPolicy(Priority var1) {
        this.hgrowPolicyProperty().set(var1);
    }

    public final Priority getHgrowPolicy() {
        return this.hgrowPolicy == null ? Priority.SOMETIMES : (Priority)this.hgrowPolicy.get();
    }

    public final ObjectProperty<Priority> hgrowPolicyProperty() {
        if (this.hgrowPolicy == null) {
            this.hgrowPolicy = new StyleableObjectProperty<Priority>(Priority.SOMETIMES) {
                @Override
                protected void invalidated() {
                    HBox.setHgrow(MyScrollPane.this, this.get() );
                }

                public CssMetaData<MyScrollPane, Priority> getCssMetaData() {
                    return MyScrollPane.StyleableProperties.HGROW_POLICY;
                }

                public Object getBean() {
                    return MyScrollPane.this;
                }

                public String getName() {
                    return "hgrowPolicy";
                }
            };
        }

        return this.hgrowPolicy;
    }

    public final void setVgrowPolicy(Priority var1) {
        this.vgrowPolicyProperty().set(var1);
    }

    public final Priority getVgrowPolicy() {
        return this.vgrowPolicy == null ? Priority.SOMETIMES : (Priority)this.vgrowPolicy.get();
    }

    public final ObjectProperty<Priority> vgrowPolicyProperty() {
        if (this.vgrowPolicy == null) {
            this.vgrowPolicy = new StyleableObjectProperty<Priority>(Priority.SOMETIMES) {
                @Override
                protected void invalidated() {
                    VBox.setVgrow(MyScrollPane.this, this.get() );
                }
                public CssMetaData<MyScrollPane, Priority> getCssMetaData() {
                    return StyleableProperties.VGROW_POLICY;
                }

                public Object getBean() {
                    return MyScrollPane.this;
                }

                public String getName() {
                    return "vgrowPolicy";
                }
            };
        }

        return this.vgrowPolicy;
    }

    public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
        return MyScrollPane.StyleableProperties.STYLEABLES;
    }

    public List<CssMetaData<? extends Styleable, ?>> getControlCssMetaData() {
        return getClassCssMetaData();
    }

    private static class StyleableProperties {
        private static final CssMetaData<MyScrollPane, Priority> HGROW_POLICY;
        private static final CssMetaData<MyScrollPane, Priority> VGROW_POLICY;
        private static final List<CssMetaData<? extends Styleable, ?>> STYLEABLES;

        private StyleableProperties() {
        }

        static {
            HGROW_POLICY = new CssMetaData<MyScrollPane, Priority>("-fx-hgrow-policy", new EnumConverter(Priority.class), Priority.SOMETIMES) {
                public boolean isSettable(MyScrollPane var1) {
                    return var1.hgrowPolicy == null || !var1.hgrowPolicy.isBound();
                }

                public StyleableProperty<Priority> getStyleableProperty(MyScrollPane var1) {
                    return (StyleableProperty)var1.hgrowPolicyProperty();
                }
            };
            VGROW_POLICY = new CssMetaData<MyScrollPane, Priority>("-fx-vgrow-policy", new EnumConverter(Priority.class), Priority.SOMETIMES) {
                public boolean isSettable(MyScrollPane var1) {
                    return var1.vgrowPolicy == null || !var1.vgrowPolicy.isBound();
                }

                public StyleableProperty<Priority> getStyleableProperty(MyScrollPane var1) {
                    return (StyleableProperty)var1.vgrowPolicyProperty();
                }
            };
            ArrayList list = new ArrayList(Control.getClassCssMetaData());
            list.add(HGROW_POLICY);
            list.add(VGROW_POLICY);
            STYLEABLES = Collections.unmodifiableList(list);
        }
    }

}

Теперь, оглядываясь назад, нацеливаясь на упрощение, мы действительно делаем его более сложным.Теперь вам решать, как поступить:)

...