我想在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()) );
});
});
}
如何通过控制器执行此操作? 我不想在主类的启动方法中这样做。
我的开始方法是这样的:
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();
}
建议的答案有效。
答案 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()
发生变化时,这将自动更新文本字段:
答案 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);
}