如何获取三个滑块的值并在 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));
(您可以类似地使用每个现有标签的简单绑定来减少现有代码。)
我正在使用 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));
(您可以类似地使用每个现有标签的简单绑定来减少现有代码。)