我在javafx scene-builder
中有一个表视图。我想使用CSS使用Vgrow ALWAYS
属性。我的表格视图在HBox
中。场景构建器允许我使用此属性。如图所示。
但是我如何使用CSS做到这一点。请帮助我。
我已经在CSS中尝试过这种方式
-fx-Vgrow: ALWAYS;
/* also */
Vgrow: ALWAYS;
什么都没有。有帮助吗?
答案 0 :(得分:0)
仅仅为了使CSS可定制,您正在考虑在控件上进行大量工作。 所有必需的css meta实现都在超类级别上定义(因此,大多数css meta数据都在Region类中定义)。由于所有javafx控件都是Region的子类,因此它们确实满足Region中设置的所有css meta数据属性。
如果要拥有自己的指定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);
}
}
}
现在回想一下,虽然目标是使事情变得简单,但实际上我们正在使其变得更加复杂。现在由您决定如何进行:)