javafx:将参数传递给fxml文件中的eventhandler函数

时间:2015-04-09 07:21:31

标签: javafx fxml eventhandler

有没有办法从保留event handler的{​​{1}}调用fxml file方法?请找到文件:

我的Fxml看起来像:

parameter

我的控制器类看起来像

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

<?import javafx.scene.image.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.cognizant.iotworkbench.View.AddImageController">
   <children>
      <Label layoutX="270.0" layoutY="14.0" text="Add Sensor" />
      <BorderPane layoutY="-1.0" prefHeight="400.0" prefWidth="602.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <left>
            <HBox fx:id="source" prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER">
               <children>
                  <ImageView fx:id="sourceimg" fitHeight="114.0" fitWidth="142.0" onDragDetected="#setUpGestureSource" pickOnBounds="true" preserveRatio="true">
                     <image>
                        <Image url="file:Images/Project.png" />
                     </image>
                  </ImageView>
               </children>
            </HBox>
         </left>
         <right>
            <HBox fx:id="target" onDragDropped="#setUpGestureTarget" onDragOver="#setUpGestureTarget" prefHeight="100.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
         </right>
      </BorderPane>
  </children>
</AnchorPane>

拖放事件未被触发。我不知道代码有什么问题。请帮忙

1 个答案:

答案 0 :(得分:0)

所有使用@FXML 注释的方法可能有也可能没有都有参数。如果您需要参数,可以直接将specific Event作为参数传递给方法。

让我们举一个例子,说你在fxml中为HBox添加了onDragOver个事件。

<HBox fx:id="targetBox" onDragOver="#setupGestureTarget">
...
</HBox>

然后你可能有一个方法可以在控制器类中完成所需的工作。

@FXML
public void setupGestureTarget(DragEvent event) {
     Dragboard db = event.getDragboard();
     if(db.hasImage()){
           event.acceptTransferModes(TransferMode.COPY);
     }
     event.consume();
}

如果您需要为其调用方法的源节点,您可以通过事件getSource()获取对该节点的访问权限,然后将其键入c Node

public void setupGestureTarget(DragEvent event) {
     ...
     ((Node)event.getSource()).setId("myHbox");
     System.out.println(targetBox.getId()); // Prints - myHbox
}

注意:要使用特定于HBox的方法,您可以将其输入到HBox而不是Node


编辑 - 根据用户评论和更新

您的方法存在多个问题。让我解决所有问题。

1.注释了@FXML的字段的注释会在FXML加载时被注入,并且不应带有new个关键字。

@FXML
final HBox target=new HBox(); 

应替换为

@FXML
final HBox target;

2.正如我已经说过,你的方法可以有一个定义Event的参数。因此,方法setUpGestureSource()setUpGestureTarget()可以定义为:

@FXML
public void setUpGestureSource(DragEvent event) {
...
}

@FXML
public void setUpGestureTarget(DragEvent event) {
...
}

3.当setUpGestureSource上出现drag-event时,会调用方法ImageView,因此您无需添加另一个 {{ 1}}为它。

EventHandler

同样,也可以更改其他方法。