如何在javafx中绑定文本大小和滑块?

eqfvzcg8  于 2023-02-07  发布在  Java
关注(0)|答案(3)|浏览(167)

嗨,我正在尝试显示一个文本对象和一个控制文本字体大小的滑块。使用JavaFX属性值观察滑块值的变化,然后根据滑块值更新文本大小。我错过了什么吗?

import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.text.Text;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;

public class TextSlider extends VBox
{
    private Text text;
    private Slider slider;
    private VBox vbox;
    private Font font;
    private double initVal = 20;
    public TextSlider()
    {
        text = new Text("Amsterdam");
        slider = new Slider(0,150,100);
        text.setFont(new Font(initVal));
       // slider.setShowTickMarks(true);
        //slider.setPadding(new Insets(10,10,10,10));
        //text.fontProperty();
        text.textProperty().bind(slider.valueProperty());
        vbox = new VBox(text,slider);
        vbox.setAlignment(Pos.CENTER);
        vbox.getChildren().addAll(vbox);

    }
}
sd2nnvve

sd2nnvve1#

你不能直接绑定字体大小,但是你可以使用text.styleProperty(),style属性可以让你像css样式一样改变外观,你甚至可以把它绑定到其他属性。

textNode.styleProperty().bind(
    Bindings.concat("-fx-font-size: ", slider.valueProperty().asString()));

这将在每次滑块的value属性更改时更新文本节点的style属性。如果滑块值更改为20,则样式将设置为-fx-font-size: 20
另一个选择是使用一个更改监听器,并在更改的事件上设置一个新字体:

slider.valueProperty().addListener(new ChangeListener<Number>() {

      @Override
      public void changed(
         ObservableValue<? extends Number> observableValue, 
         Number oldValue, 
         Number newValue) { 
            text.setFont(new Font(newValue.doubleValue()));
      }
});

Java 8+:(代码同上)

slider.valueProperty().addListener(
        (observableValue, oldValue, newValue) ->
                text.setFont(new Font(newValue.doubleValue()))
);
omjgkv6w

omjgkv6w2#

注意,问题中的代码结构是破坏性的,TextSlider类是VBox的子类,但是没有元素被添加到TextSlider示例中,而是创建了一个新的VBox并添加了内容;但是,由于无法访问新VBox,因此无法使用TextSlider类实际查看任何内容。
其他答案显示了将字体大小绑定到滑块的其他方式;imo最直接的方法是使用自定义绑定来绑定文本的fontProperty()

text.fontProperty().bind(Bindings.createObjectBinding(
    () -> Font.font(slider.getValue()),
    slider.valueProperty()
));

下面是使用此绑定的工作TextSlider类:

import javafx.beans.binding.Bindings;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class TextSlider {

    private Text text;
    private Slider slider;
    private VBox vbox;
    private double initVal = 20;
    public TextSlider(String text) {
        this.text = new Text(text);
        slider = new Slider(0,150,initVal);

       // slider.setShowTickMarks(true);
        //slider.setPadding(new Insets(10,10,10,10));

        this.text.fontProperty().bind(Bindings.createObjectBinding(
            () -> Font.font(slider.getValue()),
            slider.valueProperty()
        ));        

        vbox = new VBox(this.text,slider);
        vbox.setAlignment(Pos.CENTER);
    }

    public Node asNode() {
        return vbox ;
    }

    public StringProperty textProperty() {
        return text.textProperty();
    }

    public final String getText() {
        return textProperty().get();
    }

    public final void setText(String text) {
        textProperty().set(text);
    }

    public DoubleProperty fontSizeProperty() {
        return slider.valueProperty();
    }

    public final double getFontSize() {
        return fontSizeProperty().get();
    }

    public final void setFontSize(double fontSize) {
        fontSizeProperty().set(fontSize);
    }
}

典型的使用情形如下所示:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class App extends Application {

    @Override
    public void start(Stage stage) {
        BorderPane root = new BorderPane();
        TextSlider textSlider = new TextSlider("Amsterdam");
        root.setTop(textSlider.asNode());
        
        Scene scene = new Scene(root, 800, 800);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}
hgtggwj0

hgtggwj03#

19岁以上

slider.styleProperty().bind(fontProperty().map(f -> "-fx-font-size: " + f.getSize()));

相关问题