Lambda在JavaFX8中使用FXML

时间:2016-06-13 13:59:27

标签: java javafx lambda scenebuilder

我正在使用Scene Builder在JavaFX中使用入侵者游戏(我必须使用大炮射击飞机)但是我遇到了lambda函数的问题。

我确定代码是正确的,因为如果我通过Scene Builder的选项(On action)关联代码,它可以工作,但是,当我尝试使用lambda函数时,我无法改变我的场景。我哪里错了?

public class SchermataGiocoController {

private Parent Menu, Avvio;
private TranslateTransition tt;
private Cannone cannone; //cannone = cannon
private Aereo aereo; //aereo = plane
private Proiettile proiettile; //proiettile = bullet
private RotateTransition rt;

@FXML
private Button down;

@FXML
private Circle circle;

@FXML
private Button su;

@FXML
private Button exit;

@FXML
private ImageView cannone_im;

@FXML
private AnchorPane SchermataGioco;

@FXML
private ImageView aereo_im;

@FXML
private Button menu;

@FXML
private Button home;

@FXML
void initialize() {
    assert exit != null : "fx:id=\"exit\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert cannone_im != null : "fx:id=\"cannone_im\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert su != null : "fx:id=\"su\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert SchermataGioco != null : "fx:id=\"SchermataGioco\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert aereo_im != null : "fx:id=\"aereo_im\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert menu != null : "fx:id=\"menu\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert down != null : "fx:id=\"down\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    assert home != null : "fx:id=\"home\" was not injected: check your FXML file 'SchermataGioco.fxml'.";
    cannone = new Cannone(141, 104, 14, 362);
    proiettile = new Proiettile(16, 16, 14, 362); 
    TranslateTransition();
}


 @FXML
 public void vaiMenu() {
    menu.setOnAction((ActionEvent event) -> {                      
        try {                
            FXMLLoader loader = new FXMLLoader();                
            loader.setLocation(Game.class.getResource("/game/view/Menu.fxml"));
            Menu = (Parent) loader.load();
            menu.getScene().getWindow().hide();
        } catch (IOException ioe) {
          ioe.getMessage();
        }            
        Stage stage = new Stage();
        stage.setScene(new Scene(Menu));
        stage.show();
    });
}

1 个答案:

答案 0 :(得分:2)

如果您将vaiMenu()与" On Action"在SceneBuilder,然后(正如预期的那样),例如当对Button执行单击时,将执行vaiMenu()方法,这将执行:为Button的操作事件分配一个侦听器(通过lambda),因此它永远不会被执行,只是一次又一次地添加。

如果您想通过SceneBuilder分配监听器,请执行以下操作:

<Button fx:id="menu" onAction="#vaiMenu" />

你不能使用lambdas(匿名函数),因为你需要在你的FXML文件中引用一个命名函数(在onAction属性中)。

如果您将当前的lambda插入例如控制器的initialize()方法,它可以正常工作,但在这种情况下,你不应该在FXML文件中定义这个属性。