如何在javaFX程序的控制器中定义滑块更改方法?

时间:2016-11-14 16:20:10

标签: slider javafx-8 fxml

我想在fxml文件的控制器中创建一个方法,我希望此方法在滑块更改时起作用。 我有一个像这样的fxml文件:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>

<AnchorPane prefHeight="150.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Slider fx:id="mySlider" blockIncrement="0.1" layoutX="26.0" layoutY="32.0" majorTickUnit="0.5" max="1.0" minorTickCount="1" showTickLabels="true" showTickMarks="true" />
      <TextField fx:id="textField" layoutX="100.0" layoutY="99.0" prefHeight="25.0" prefWidth="75.0" />
      <Label layoutX="43.0" layoutY="103.0" text="Label" />
   </children>
</AnchorPane>

我希望有一个像这样的控制器

package paper.view;

import javafx.fxml.FXML;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;

public class RootController 
{

    @FXML
    private Slider mySlider;
    @FXML
    private TextField textField;


    mySlider.valueProperty().addListener((observable, oldValue, newValue) -> {
        textFieldOfEp.setText(Double.toString(newValue.doubleValue())   );

    });


    });


}

我想反映textField中滑块的变化。 喜欢这张图片: enter image description here

如何通过控制器执行此操作? 我不想在主类的启动方法中这样做。

我的开始方法是这样的:

public void start(Stage primaryStage) throws IOException
    {
        FXMLLoader loader=new FXMLLoader();
        loader.setLocation(mainApp.class.getResource("view/Root.fxml"));
        AnchorPane ap=loader.load();
        Scene scene=new Scene(ap);
        primaryStage.setScene(scene);
        primaryStage.show();

    }
建议的答案有效。

2 个答案:

答案 0 :(得分:3)

您应该在控制器的initialize()方法中注册监听器:

package paper.view;

import javafx.fxml.FXML;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;

public class RootController 
{

    @FXML
    private Slider mySlider;
    @FXML
    private TextField textField;

    public void initialize() {

        mySlider.valueProperty().addListener((observable, oldValue, newValue) -> {

            textField.setText(Double.toString(newValue.intValue()));


        });

    }


}

并确保在FXML文件中指定控制器:

<AnchorPane fx:controller="paper.view.RootController" prefHeight="150.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">

或直接在代码中设置FXMLLoader上的控制器。

当滑块的值intValue()发生变化时,这将自动更新文本字段:

Slider value at zero

Slider value at one

答案 1 :(得分:0)

我只是偶然发现属性onValueChange可以解决问题,需要处理程序使用ChangeListener<Number>签名(Double也可以):

<Slider onValueChange="#doStuff"/>

@FXML
private void doStuff(ObservableValue<Number> ovn, Number before, Number after) {
    System.out.println(before+" "+after);
}