我想使用FX8 Spinner控件,但我想将源绑定到IntegerProperty
int MIN = 0;
int MAX = 5000;
int STEP = 500;
IntegerProperty integerProperty = new SimpleIntegerProperty();
Spinner<Integer> spinner = new Spinner<>(MIN, MAX, STEP);
Run Code Online (Sandbox Code Playgroud)
我知道绑定是通过绑定到valuePropertyValue Factory中设置的.然而,这种希望Property<Integer>,我无法找到一个方法来之间进行转换IntegerProperty和Property<Integer>.
显然下面会生成一个编译器错误:
spinner.getValueFactory().valueProperty().bindBidirectional(integerProperty);
Run Code Online (Sandbox Code Playgroud)
我是否需要为两个方向手动分配更改侦听器?当然有一个更简洁的解决方案使用valueProperty,这不可能是一个无法预料的情况.
对于数字输入,将模拟控件与文本显示同步有时会很方便。在此Swing 示例中,a JSpinner和a JSlider分别监听更改事件,并分别更新对方的模型以进行匹配。如下所示,一个类似的JavaFX程序将a Spinner和a 连接起来Slider,这些侦听器使控件保持协调:
slider.valueProperty().addListener((Observable o) -> {
spinner.getValueFactory().setValue(slider.getValue());
});
spinner.valueProperty().addListener((Observable o) -> {
slider.setValue((double) spinner.getValue());
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我StringConverter在微调器中添加时SpinnerValueFactory,初始值是未格式化的,直到更改了任何一个控件为止-即使在添加转换器后再次显式设置初始值时:
spinner.getValueFactory().setConverter(…);
spinner.getValueFactory().setValue(INITIAL_VALUE);
Run Code Online (Sandbox Code Playgroud)
我要去哪里错了?
import java.text.NumberFormat;
import javafx.application.Application;
import javafx.beans.Observable;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.control.Spinner;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.util.converter.PercentageStringConverter;
/**
* @see /sf/answers/424759051/
*/
public class SpinSlider extends Application {
private static final double MIN = 0;
private static final double MAX …Run Code Online (Sandbox Code Playgroud)