我在javafx scene-builder 中有一个表视图 . 我想使用css使用Vgrow ALWAYS 属性 . 我的表视图在 HBox 内 . 场景构建器允许我使用此属性 . 如图所示 .
scene-builder
ALWAYS
HBox
但我怎么用css做到这一点 . 请帮我 .
我用这种方式用css试了一下
-fx-Vgrow: ALWAYS; /* also */ Vgrow: ALWAYS;
什么都行不通任何帮助?
只是为了使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); } } }
现在回顾一下,虽然目标是简化,但我们确实让它变得更加复杂 . 现在由你决定如何继续:)
1 回答
只是为了使CSS可自定义,你正在考虑对你的控件进行大量的工作 . 所有必需的css元实现都是在超类级别上定义的(因此大多数css元数据都是在Region类中定义的) . 由于所有javafx控件都是Region的子类,因此它们确实满足Region中设置的所有css元数据属性 .
如果您想拥有自己的指定css元数据,那么您必须在每个您想拥有的控件上定义明确性 . (这又是一件大事) .
我并不是说这是无法做到的事情 . 下面是自定义ScrollPane的演示代码,包括vgrow和hgrow作为css元属性 . 它完美地运作!!试想一下,如果你想要所有控件的以下功能,你必须自定义你想通过css配置的每个控件;) .
css文件代码:
和自定义的ScrollPane控件:
现在回顾一下,虽然目标是简化,但我们确实让它变得更加复杂 . 现在由你决定如何继续:)