【问题标题】:Make a label update while dragging a slider拖动滑块时进行标签更新
【发布时间】:2014-04-01 08:20:36
【问题描述】:

我在我的 javaFX 项目中使用Slider,并且我有一个Label,当我移动滑块时会更新。

我希望Label 在拖动Slider 时更新,而不仅仅是在拖放时更新。

这是我的代码:

 betSlider.valueChangingProperty().addListener(new ChangeListener<Boolean>() {
            @Override
            public void changed(ObservableValue<? extends Boolean> source, Boolean oldValue, Boolean newValue) {
                betLabel.textProperty().setValue(String.valueOf((int)betSlider.getValue()));
  } });

【问题讨论】:

标签: slider javafx label drag


【解决方案1】:

您只需将valueChangingProperty() 更改为valueProperty() 和TADA,它就可以随心所欲!

这里附上一个小样本:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Demo extends Application {

    @Override
    public void start(Stage primaryStage) {
        // Add a scene
        VBox root = new VBox();
        Scene scene = new Scene(root, 500, 200);

        final Label betLabel = new Label("sdsd");

        final Slider betSlider = new Slider();
        betSlider.valueProperty().addListener(new ChangeListener<Number>() {

                @Override
                public void changed(
                   ObservableValue<? extends Number> observableValue, 
                   Number oldValue, 
                   Number newValue) { 
                      betLabel.textProperty().setValue(
                           String.valueOf(newValue.intValue());
                  }
            }
        });

        root.getChildren().addAll(betSlider, betLabel);
        betLabel.textProperty().setValue("abc");

        // show the stage
        primaryStage.setTitle("Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

【讨论】:

    【解决方案2】:

    将标签的 textProperty 绑定到滑块的 valueProperty。

    绑定中需要进行格式转换才能使其正常工作。

    Itachi 的 valueProperty() ChangeListener 或绑定都可以工作。

    import javafx.application.Application;
    import javafx.beans.binding.Bindings;
    import javafx.scene.Scene;
    import javafx.scene.control.*;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class Slide extends Application {
        @Override public void start(Stage stage) {   
            Label  label  = new Label();
            Slider slider = new Slider(1, 11, 5);
    
            label.textProperty().bind(
                Bindings.format(
                    "%.2f",
                    slider.valueProperty()
                )
            );
    
            VBox layout = new VBox(10, label, slider);
            layout.setStyle("-fx-padding: 10px; -fx-alignment: baseline-right");
    
            stage.setScene(new Scene(layout));
            stage.setTitle("Goes to");
            stage.show();
        }
    
        public static void main(String[] args) { launch(args); }
    }
    

    【讨论】:

      【解决方案3】:

      如果你想完全在 FXML 中做,你可以这样做:

      <TextField prefWidth="50" text="${speedSlider.value}"/>
      <Slider fx:id="speedSlider" orientation="HORIZONTAL" prefWidth="300"
              min="60" max="100000" blockIncrement="100"/>
      

      【讨论】:

      • 使用这个,TextField 不能再被改变,你能给出一个版本,改变TextField 也会改变Slider
      【解决方案4】:

      添加一个对我来说似乎更简单、更容易的替代方法:

      给定一个名为 slMySlider 的滑块和一个名为 lblMySlider 的标签

      1. 将 MouseEvent.MOUSE_DRAGGED 事件处理程序添加到滑块并让它调用辅助方法:
      slMySlider.addEventHandler(MouseEvent.MOUSE_DRAGGED, this::changeLabelHandler);
      
      1. 让辅助方法更改标签的文本:
      private void changeLabelHandler(MouseEvent e) {
              lblMySlider.setText("Value: " + String.format("%1.2f", slMySlider.getValue()));
          }
      

      【讨论】:

        【解决方案5】:
        slider.valueProperty().addListener((observable, oldValue, newValue) ->
        label.setText("sliderNameLabel: " + newValue));
        

        【讨论】:

        • 欢迎您,感谢您提供答案。您能否编辑您的答案以包括对您的代码的解释?这将有助于未来的读者更好地理解正在发生的事情,尤其是那些不熟悉该语言并努力理解这些概念的社区成员。在这里尤其如此,因为您的答案正在与五个公认的答案竞争注意力。
        【解决方案6】:

        如果你在 JavaFX 8 中有一个滑块,你可以这样做:

        slider().addListener(e -> {
            // Your code here could be anything.
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-25
          • 2016-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多