【问题标题】:How to handle a ActionEvent from another class如何处理来自另一个类的 ActionEvent
【发布时间】:2016-04-25 12:55:38
【问题描述】:

我正在使用 JavaFX 并正在做一个 Schoolproject。

关于我的程序,我有一个登录屏幕,如果我按下登录,我会来到大型机。主机的内容区域是空的,因为我在使用菜单栏中的按钮时为构建主机的 AnchorPane 加载了内容。

当我按下登录按钮时,我想在其中加载大型机和主窗格。但我不知道如何将窗格从另一个类加载到大型机中。

这是我的代码:

加载主机的代码:

@FXML
protected void login(ActionEvent event) throws IOException, URISyntaxException {
    Stage stage;
    Parent root = null;
    stage = (Stage) btnLogin.getScene().getWindow();
    try{
        root = FXMLLoader.load(getClass().getResource("view/mainframe.fxml"));
        } catch (IOException e){
            e.printStackTrace();
        }
    Scene scene = new Scene(root, 1280, 900);
    stage.setScene(scene);
    stage.show();       

}

将主页窗格加载到大型机中的代码:

@FXML
protected void mHome(ActionEvent event) throws IOException, URISyntaxException {

    try {                    
        URL url = getClass().getResource("view/home.fxml");
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(url);
        fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
        AnchorPane page = (AnchorPane) fxmlLoader.load(url.openStream()); 

        aContent.getChildren().clear();
        aContent.getChildren().add(page);
    } 
    catch (IOException e) {
        e.printStackTrace();
    }

}

这两个方法在不同的类中。

如果您需要更多信息,请告诉我:)

谢谢你,提莫

【问题讨论】:

    标签: java javafx actionevent


    【解决方案1】:

    只需调用mHome() 方法。请注意,由于您从不使用ActionEvent,您可以从方法签名中省略它(FXMLLoader 仍然能够将其映射为事件处理程序)。所以改成

    @FXML
    protected void mHome() throws IOException, URISyntaxException {
    
        try {                    
            URL url = getClass().getResource("view/home.fxml");
            FXMLLoader fxmlLoader = new FXMLLoader();
            fxmlLoader.setLocation(url);
            fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
            AnchorPane page = (AnchorPane) fxmlLoader.load(url.openStream()); 
    
            aContent.getChildren().clear();
            aContent.getChildren().add(page);
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
    
    }
    

    如果您总是希望在第一次显示主窗格时显示“主窗格”,只需在同一控制器类中对initialize() 方法添加对mHome 的调用:

    public void initialize() {
        // existing code...
    
        mHome();
    }
    

    或者,如果您只想在从登录窗格加载“主页窗格”时显示它,请在登录处理程序中添加对 mHome 的调用:

    @FXML
    protected void login(ActionEvent event) throws IOException, URISyntaxException {
        Stage stage;
        Parent root = null;
        stage = (Stage) btnLogin.getScene().getWindow();
        try{
            FXMLLoader loader = new FXMLLoader(getClass().getResource("view/mainframe.fxml"));
            root = loader.load();
            MainController controller = loader.getController();
            controller.mHome();
        } catch (Exception e){
            e.printStackTrace();
        }
        Scene scene = new Scene(root, 1280, 900);
        stage.setScene(scene);
        stage.show();       
    
    }
    

    (我假设MainControllermainframe.fxml 的控制器类的名称;显然只是根据需要进行调整。)

    【讨论】:

    • 好的,我试过了,它有效。现在的问题是我已经在代码中实现了这个:'aContent.getChildren().clear(); aContent.getChildren().add(page);'在我将新的 fxml 添加到窗格之前,这会清除 AnchorPane aContent。但现在它是空的,所以它无法清除它并给我一个错误......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多