如何获取三个滑块的值并在 JavaFX 中将它们相乘?

How to get the value of three sliders and multiply them in JavaFX?

我正在使用 JavaFX 编写一个 window,其中包含三个标记为高度、长度和宽度的滑块。每个滑块的值最多可以为 100。我的问题是我想添加一个标签卷。这应该乘以三个滑块的值并在 window 上实时打印,所以如果我更改一个滑块的值,音量应该立即更新。 我用的是javafx的VBox包。

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;

import java.awt.*;

public class HelloFX extends Application {

    @Override
    public void start(Stage stage) {
        stage.setTitle("Volumen");
        Slider slider1=new Slider(0,100,0);
        Slider slider2=new Slider(0,100,0);
        Slider slider3=new Slider(0,100,0);

        Label label1=new Label("height");
        Label label2=new Label("length");
        Label label3=new Label("width");

        Label infoLabel=new Label("-");
        infoLabel.setTextFill(Color.RED);
        Label infoLabel2=new Label("-");
        infoLabel2.setTextFill(Color.BLUE);
        Label infoLabel3=new Label("-");
        infoLabel3.setTextFill(Color.GREEN);

        VBox vBox = new VBox();
        Scene scene = new Scene(vBox, 960, 600);
        slider1.setShowTickMarks(true);
        slider1.setShowTickLabels(true);
        slider1.setMajorTickUnit(25.0);
        slider1.setShowTickMarks(true);

        slider2.setShowTickMarks(true);
        slider2.setShowTickLabels(true);
        slider2.setMajorTickUnit(25.0);
        slider2.setShowTickMarks(true);

        slider3.setShowTickMarks(true);
        slider3.setShowTickLabels(true);
        slider3.setMajorTickUnit(25.0);
        slider3.setShowTickMarks(true);

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

            @Override
            public void changed(ObservableValue<? extends Number> observable, //
                                Number oldValue, Number newValue) {

                infoLabel.setText("height: " + newValue);
            }
        });
        slider2.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> observable, //
                                Number oldValue, Number newValue) {

                infoLabel2.setText("length: " + newValue);
            }
        });
        slider3.valueProperty().addListener(new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> observable, //
                                Number oldValue, Number newValue) {

                infoLabel3.setText("width: " + newValue);
            }
        });

        vBox.setPadding(new Insets(20));
        vBox.setSpacing(10);
        vBox.getChildren().addAll(label1,slider1, infoLabel);
        vBox.getChildren().addAll(label2,slider2, infoLabel2);
        vBox.getChildren().addAll(label3,slider3, infoLabel3);

        stage.setScene(scene);
        stage.show();
    }
    public static void main(String[] args) {
        launch();
    }
}

您显然可以简单地更新三个现有侦听器中的每一个的音量标签,但更简洁的方法是使用绑定:

    DoubleProperty volume = new SimpleDoubleProperty();
    volume.bind(
        slider1.valueProperty()
        .multiply(slider2.valueProperty())
        .multiply(slider3.valueProperty())
    );
    Label volumeLabel = new Label();
    volumeLabel.textProperty().bind(Bindings.format("Volume: %.1f", volume));

(您可以类似地使用每个现有标签的简单绑定来减少现有代码。)