2015-08-10 3 views
0

Я считаю, что это очень глупый вопрос, но мне этого не удается. Если вы создали проект FXML-Template с Java, вы автоматически получаете три файла. Представление в XML, контроллер и начальный файл в java. Я хочу использовать сцену в классе контроллера, но я не знаю, как сделать ссылку для этого. Вот мой пример:JavaFX Использование шаблона Netbeans Приложение Javfx FML

public class CatchTheScene extends Application { 
private Scene scene; 
private Parent root; 



@Override 
public void start(Stage stage) throws Exception { 
    root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml")); 
    FXMLDocumentController controller = new FXMLDocumentController(this); 
    scene = new Scene(root); 

    stage.setScene(scene); 
    stage.show(); 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 
    launch(args); 
} 

/** 
* @return the scene 
*/ 
public Scene getScene() { 
    return scene; 
} 

/** 
* @param scene the scene to set 
*/ 
public void setScene(Scene scene) { 
    this.scene = scene; 
} 

}

общественного класса FXMLDocumentController реализует Initializable {

private CatchTheScene c; 
@FXML 
private Label label; 
@FXML 
private Button button; 
@FXML 
private AnchorPane root; 

@FXML 
private void handleButtonAction(ActionEvent event) { 
    System.out.println("You clicked me!"); 
    label.setText("Hello World!"); 
} 

public FXMLDocumentController(CatchTheScene c) 
{ 
    this.c = c; 
} 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // TODO 
    c.getScene().addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>(){ 

     @Override 
     public void handle(MouseEvent event) { 
      System.out.println("I am the scene and have been clicked"); 
     } 
    }); 
}  

}

+0

Есть ли конкретная причина, вы хотите сделать это в контроллере? «Scene» не является частью FXML, поэтому на самом деле нет смысла регистрировать обработчики событий на нем в контроллере FXML. Вы можете зарегистрировать обработчик со сценой в методе 'Application.start()' или (возможно, менее распространенный), создать «Scene» в файле FXML. –

+0

Приведенный выше пример является лишь примером для упрощения моей проблемы. Я пытаюсь создать игру, где я хочу поместить все элементы управления в класс контроллеров в соответствии с шаблоном MVC. Поэтому было бы прекрасно, если бы вы знали, как справиться с этой проблемой. Я создал GUI с помощью Scene Builder. Возможно, есть возможность объявить сцену в Scene Builder. В этом случае было бы проблемой для решения моей проблемы. – user3747849

ответ

0

Я решил сейчас. Сначала я дал сценаристу Code FX: ID с именем root в корневую панель. корня в контроллере объект, и я зарегистрирован на корне EventListener.`

@FXML 
private Canvas canvas; 
@FXML 
private AnchorPane root; 

root.setOnKeyPressed(new EventHandler<KeyEvent>() { 

     @Override 
     public void handle(KeyEvent e) { 
      if (e.getCode() == KeyCode.LEFT) { 

       clownfish.setDx(-10); 
       clownfish.moveLeft(); 
      } 
      if (e.getCode() == KeyCode.RIGHT) { 

       clownfish.setDx(-10); 
       clownfish.moveRight(); 
      } 

      if (e.getCode() == KeyCode.UP) { 

       clownfish.setDy(-10); 
       clownfish.moveUp(); 
      } 
      if (e.getCode() == KeyCode.DOWN) { 

       clownfish.setDy(-10); 
       clownfish.moveDown(); 
      } 
     } 
    }); 
Смежные вопросы