【发布时间】:2023-04-07 11:34:01
【问题描述】:
我认为这是一个非常愚蠢的问题,但我无法做到这一点。如果您使用 Java 制作了 FXML-Template 项目,您会自动获得三个文件。 XML 中的视图、控制器和 java 中的启动文件。 我想在控制器类中使用场景,但我不知道如何引用来执行此操作。 这是我的例子:
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");
}
});
}
}
【问题讨论】:
-
您是否有特定原因要在控制器中执行此操作?
Scene不是 FXML 的一部分,因此在 FXML 的控制器中注册事件处理程序并没有多大意义。您可以在Application.start()方法中向场景注册处理程序,或者(可能不太常见)在 FXML 文件中创建Scene。 -
上面的例子只是为了简化我的问题。我尝试制作一个游戏,我想根据 MVC 模式将所有控制放在控制器类中。因此,如果您知道如何处理问题,那将是完美的。我使用 Scene Builder 制作了 GUI。也许有可能在场景生成器中声明场景。在这种情况下,处理我的问题是没有问题的。
标签: netbeans javafx fxmlloader