Просто для того, чтобы сделать его настраиваемым с помощью 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);
}
}
}
Теперь, оглядываясь назад, нацеливаясь на упрощение, мы действительно делаем его более сложным.Теперь вам решать, как поступить:)