2016-06-13 2 views
2

저는 Scene Builder를 사용하여 JavaFX의 침입자 게임을 작업하고 있습니다. (저는 비행기를 오 대포로 쏘아 야합니다.)하지만 나는 람다 함수에 문제가 있습니다.JavaFX8에서 FXML이있는 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(); 
    }); 
} 
+0

작업 코드의 모양을 보여줄 수 있습니까? 람다는 전혀 변화를주지 않아야합니다. – zapl

+0

여기서 실제로 달성하려는 내용에 대해 자세히 설명해 주시겠습니까? 나는 당신의 문제가 람다 표현과 전혀 관련이 있다고 생각하지 않는다. 오히려 청취자가하는 일에 대한 오해이다. – 1279343

+0

람다 함수를 사용하여 장면을 변경하고 싶습니다. 게시물의 다른 부분을 추가하여 편집했습니다. "메뉴"는 그것을 클릭하는 버튼입니다. 다른 화면으로 이동하는 장면을 변경해야합니다. –

답변

2

당신은 (이 예상 될 때) 다음 SceneBuilder에서 "액션에"에 대한 예와 vaiMenu()를 연결하는 경우 Button에서 클릭이 수행되면 Button의 액션 이벤트에 대한 리스너 (람다를 통해)를 할당하므로 결코 실행되지 않고 다시 추가 될뿐입니다. Button에서 클릭이 수행되면 vaiMenu() 메서드가 실행됩니다. 다시.

당신이 SceneBuilder 통해 리스너를 지정하려면

좋아 : 당신이합니다 ( onAction 속성에) 당신의 FXML 파일에서 참조하는 명명 된 기능을 필요로하는 당신은 람다 (익명 함수)를 사용할 수 없습니다

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

.

현재 람다를 예 : 컨트롤러의 initialize() 메소드를 사용하면 문제없이 작동하지만이 경우 FXML 파일에이 속성을 정의하면 안됩니다.

관련 문제