为什么我的JavaFX滑块事件无法触发?

时间:2017-01-14 16:30:14

标签: java events javafx

我在移动时试图显示滑块的值。

这是我迄今为止尝试过的但是没有用的:

public class ControlsController extends BaseController{
    @FXML
    private Slider slAcceleration;

    @FXML
    public void slAccelerationEventHandler(DragEvent event){
        System.out.println(slAcceleration.getValue());
    }
}

我的.fxml代码:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Slider?>
<?import javafx.scene.layout.Pane?>

<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="250.0" prefWidth="300.0" style="-fx-background-color: bdc3ff;" xmlns="http://javafx.com/javafx/8.0.102" xmlns:fx="http://javafx.com/fxml/1" fx:controller="controller.ControlsController">
   <children>
      <Label id="lbAcceleration" layoutX="14.0" layoutY="125.0" text="Versnelling simulatie x60" />
      <Slider id="slAcceleration" blockIncrement="1.0" layoutX="14.0" layoutY="151.0" max="600.0" min="1.0" onDragDone="#slAccelerationEventHandler" prefHeight="14.0" prefWidth="280.0" value="60.0" />
   </children>
</Pane>

如果我发布更多信息,请告诉我。任何帮助都会受到极大的关注!

2 个答案:

答案 0 :(得分:1)

startDragAndDrop()事件是“拖放”系统的一部分。它在完全拖放处理期间调用(在应用程序中或应用程序之间移动数据),只有在您之前在某个节点上调用initialize时才会调用。

这里需要观察滑块的valueProperty()。没有为此生成事件,因此在控制器的public class ControlsController extends BaseController{ @FXML private Slider slAcceleration; public void initialize() { slAcceleration.valueProperty().addListener((obs, oldValue, newValue) -> { System.out.println(newValue.doubleValue()); }); } } 方法中注册侦听器:

id

请注意,您的FXML文件中也有错误:您使用的是fx:id而不是@FXML。您需要解决此问题,否则控制器中的a = "xyaabbbccccdefww" b = "xxxxyyyyabklmopq" longest(a, b) -> "abcdefklmopqwxy" function longest(s1, s2) { var sortedString = ''; var a = s1.split(); var b = s2.split(); for (i=0; i < a.length; i++) { if (!sortedString.includes(a[i])) { sortedString.concat(a[i]); } } for (j=0; j < b.length; j++) { if (!sortedString.includes(b[j])) { sortedString.concat(b[j]); } } return sortedString.sort(); } 注入字段将不会被初始化。

答案 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);
}