我想向我的自定义标签添加自定义 CSS 整数属性(在此示例中我使用-fx-foo
)。这是我的代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.css.CssMetaData;
import javafx.css.Styleable;
import javafx.css.StyleableIntegerProperty;
import javafx.css.converter.SizeConverter;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class NewMain extends Application {
public static class FooLabel extends Label {
private static final CssMetaData<FooLabel, Number> FOO_PROPERTY = new CssMetaData<FooLabel, Number>("-fx-foo",
SizeConverter.getInstance(), 10) {
@Override
public boolean isSettable(FooLabel label) {
return true;
}
@Override
public StyleableIntegerProperty getStyleableProperty(FooLabel label) {
return (StyleableIntegerProperty) label.fooProperty();
}
};
private static final List<CssMetaData<? extends Styleable, ?>> CSS_META_DATA;
static {
List<CssMetaData<? extends Styleable, ?>> list = new ArrayList<>(Label.getClassCssMetaData());
list.add(FOO_PROPERTY);
CSS_META_DATA = Collections.unmodifiableList(list);
}
public static List<CssMetaData<? extends Styleable, ?>> getClassCssMetaData() {
return CSS_META_DATA;
}
private final StyleableIntegerProperty foo = new StyleableIntegerProperty(10) {
@Override
public CssMetaData getCssMetaData() {
return FOO_PROPERTY;
}
@Override
public Object getBean() {
return FooLabel.this;
}
@Override
public String getName() {
return "foo";
}
};
public FooLabel() {
super();
foo.addListener((observable, oldValue, newValue) -> {
System.out.println("NEW VALUE:" + newValue);
});
}
public IntegerProperty fooProperty() {
return foo;
}
public void setFoo(int foo) {
this.foo.set(foo);
}
public int getFoo() {
return foo.get();
}
}
/**************** MAIN APP *****************/
@Override
public void start(Stage primaryStage) {
var fooLabel = new FooLabel();
fooLabel.getStyleClass().add("test");
fooLabel.setText("abc");
VBox root = new VBox(fooLabel);
root.getStylesheets().add(NewMain.class.getResource("test.css").toExternalForm());
Scene scene = new Scene(root, 100, 100);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
和 CSS:
.test {
-fx-foo: 100;
-fx-background-color: yellow;
}
代码已编译,运行时不会抛出任何异常。标签为黄色。但是,foo
属性从未改变,似乎-fx-foo
只是被忽略了。有人能说说如何修复它吗?