首页 文章

如何在javafx css中使用Vgrow ALWAYS属性

提问于
浏览
-1

我在javafx scene-builder 中有一个表视图 . 我想使用css使用Vgrow ALWAYS 属性 . 我的表视图在 HBox 内 . 场景构建器允许我使用此属性 . 如图所示 .

enter image description here

但我怎么用css做到这一点 . 请帮我 .

我用这种方式用css试了一下

-fx-Vgrow: ALWAYS;

/* also */

Vgrow: ALWAYS;

什么都行不通任何帮助?

1 回答

  • 0

    只是为了使CSS可自定义,你正在考虑对你的控件进行大量的工作 . 所有必需的css元实现都是在超类级别上定义的(因此大多数css元数据都是在Region类中定义的) . 由于所有javafx控件都是Region的子类,因此它们确实满足Region中设置的所有css元数据属性 .

    如果您想拥有自己的指定css元数据,那么您必须在每个您想拥有的控件上定义明确性 . (这又是一件大事) .

    我并不是说这是无法做到的事情 . 下面是自定义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);
            }
        }
    
    }
    

    现在回顾一下,虽然目标是简化,但我们确实让它变得更加复杂 . 现在由你决定如何继续:)

相关问题