当前位置: 首页 > 知识库问答 >
问题:

JavaFX微调器工作不正确。旋转器。valueProperty()。addListener更改了两次

祁博涛
2023-03-14

我不明白为什么,如果微调器调用ChangeListener两次。我怎样才能做到只打一次电话?

控制器。JAVA

public class Controller {
@FXML
Spinner<Double> spinner;
@FXML
public void initialize(){
    spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));

    spinner.valueProperty().addListener(new ChangeListener<Double>() {
        @Override
        public void changed(ObservableValue<? extends Double> observable, Double oldValue, Double newValue) {
            System.out.println("Old Value" + oldValue + "New Value" + newValue);
        }
    });
}}

主要的JAVA

 public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root =     FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }
    public static void main(String[] args) {
        launch(args);
    }}

输出:

Old Value 60.0 New Value 780.0
Old Value 780.0 New Value 350.0

共有1个答案

颛孙智勇
2023-03-14

这是因为工厂

spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0,350,60,1));

微调器的最大值为350。输入780:该值将更改为此值,然后由于最大值,它将更改回350。

更新:

默认情况下,当按下Enter键时,将提交Spner编辑器中的值。

为了避免自动绑定,您可以尝试覆盖默认提交逻辑:

spinner.getEditor().setOnAction(e -> {

    String text = spinner.getEditor().getText();
    SpinnerValueFactory<Double> valueFactory = spinner.getValueFactory();
    if (valueFactory != null) {
        StringConverter<Double> converter = valueFactory.getConverter();
        if (converter != null) {
            try{
                Double value = converter.fromString(text);
                if (value >= minValue && value <= maxValue)
                    valueFactory.setValue(value);
                else
                    valueFactory.setValue(Math.max(Math.min(maxValue, value), minValue));

                // This ensures that if the value us e.g. 350, then 450 entered, the text 
                // is updated to 350 again (rather than ramaining 450)
                spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
            } catch(NumberFormatException nfe){
                spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
            }
        }
    }

    e.consume();
});

这些值定义为:

double maxValue = 350;
double minValue = 0;
spinner.setValueFactory(
    new SpinnerValueFactory.DoubleSpinnerValueFactory(minValue, maxValue, 60, 1));

注:

也可以从SpinnerValueFactory中检索最小值和最大值-不幸的是,不是以完全干净的方式,而是通过一些铸造:

spinner.getEditor().setOnAction(e -> {
    SpinnerValueFactory.DoubleSpinnerValueFactory valueFactory = (SpinnerValueFactory.DoubleSpinnerValueFactory) spinner.getValueFactory();

    if (valueFactory != null) {
        StringConverter<Double> converter = valueFactory.getConverter();
        if (converter != null) {
            try {
                valueFactory.setValue(Math.max(Math.min(valueFactory.getMax(), 
                        converter.fromString(spinner.getEditor().getText())), valueFactory.getMin()));

                spinner.getEditor().setText(converter.toString(valueFactory.getValue()));

            } catch(NumberFormatException nfe){
                spinner.getEditor().setText(converter.toString(valueFactory.getValue()));
            }
        }
    }

    e.consume();
});

但在这种情况下,不必存储最小值和最大值,它们是从工厂本身获得的:

spinner.setValueFactory(new SpinnerValueFactory.DoubleSpinnerValueFactory(0, 350, 60, 1));

 类似资料:
  • 我正试图让一个旋转器(2)改变另一个旋转器(1)的内容。 我当前在第二个微调器的数组适配器中遇到错误“错误:(28,57)错误:无法推断数组适配器的类型参数 这是我的代码: 任何帮助都将不胜感激。

  • 我有一个ImageView,可以用鼠标拖放,点击按钮旋转90度。这两件事在独立完成时都可以工作(因此可以旋转或移动ImageView,而不是两者都可以)。当我旋转ImageView并尝试移动它时,它似乎是随机移动的。 我使用以下方法旋转图像视图: 这导致了我所说的看似随机的运动。 我还尝试使用以下方法旋转ImageView: 位置是图像在屏幕上的位置。宽度和高度是ImageView的宽度和高度。

  • 我正在用一艘宇宙飞船做一个游戏,当按下“前进”按钮时,后面会出现一个火的图像。这只在太空船垂直站立时起作用。当它倒转时,它与宇宙飞船的后部没有完全对齐。这是我为其创建的类的更新函数。 我试着将原点设置为火箭的原点,这对我来说似乎是合乎逻辑的,但我认为我不完全理解原点是什么。 [编辑1] 我不认为问题出在原点上,我现在把它设置为 我认为这个问题与我总是将y设置为(火箭弹射出的火的高度是火箭弹高度的一

  • 我在这个网站上看到过关于javafx中旋转的问题,但我似乎不太明白。下面是一些代码: 为什么当我改变角度时,矩形开始出现在随机位置?例如,当我将角度设置为 180 时,矩形出现在中间。我的理解是,矩形围绕 X:150 和 Y:225 以指定的角度移动。但是,当我将角度设置为180时,我完全错了。你们能帮帮我吗? 编辑:在阅读和看到回答这个问题的代码时,我想我发现了一个新问题。如何设置pivotX和

  • 我的程序以前工作得很好,我将我的场景构建器从JavaFx场景构建器2.0改为gluon场景构建器10,以添加一些CSS样式。我添加了样式,程序显示了如下错误:警告:由版本9.0.4的JavaFX运行时用版本10.0.1的JavaFX API加载FXML文档,然后我将JDK更新到版本10.0.2,但它显示了如下错误。 我的主要课程是 我的控制器类是 fontawesome版本:

  • 我试图找出如何检测一些对象属性的变化。所以一开始我就意识到该怎么做,而且很管用。我不知道是否有更好的方法(如果你们知道是否有更好的方法,请告诉我)。 问题是,我还有另一个问题要解决,我不想检测变化,我只想获得属性的新设置值。因此,我知道使用javafx.beans.value.ChangeListener接口可以检测某个属性的每一个更改,这就是我的问题所在,因为我创建了一个实现ChangeList