JavaFX中的Button Action以错误的顺序执行

时间:2014-06-30 08:47:23

标签: java button controller javafx initialization

更新1 :这是一个更有趣的事情。当我删除最后一行{mainapp.showReportingScreen();}时,程序首先执行findAplliedJars方法然后显示处理屏幕。


我在JavaFX中工作并且在按钮操作上苦苦挣扎。我想要的是,当点击该按钮时:

  1. 做点什么;
  2. 显示另一个屏幕;
  3. 做另一件事;
  4. 显示另一个屏幕;
  5. 但是,我的程序跳过2.点。

    这是我的代码:

    public class SomeController implements Initializable {
        .
        .
        .
    @Override
    public void initialize(URL location, ResourceBundle resources) {
               .
               .
               .
        someButton.setOnAction(new EventHandler<ActionEvent>(){
            public void handle(ActionEvent event) {             
    
                Report.setUserName(userNameField.getText());
                Report.setPassword(passwordField.getText());
                Report.setSmAdress(smAdressField.getText());
                mainApp.showProcessingScreen();
                Report.findAppliedJars();
                mainApp.showReportingScreen();
    
            }
        });        
    }   
        . 
        .
        .
    }
    

    因此,如果没有显示 processingScreen ,我的程序会执行 findAppliedJars(),然后显示 reportingScreen

    可能是什么问题?感谢。


    更新2 :这是我的showProcessingScreen()方法:

    public void showProcessingScreen() {
            try {
                // Load Report Screen
                FXMLLoader loader = new FXMLLoader();               
                loader.setLocation(MainApp.class.getResource("ProcessingScreen.fxml"));         
                AnchorPane processingScreen = (AnchorPane) loader.load();           
                // Set report screen into the center of root layout.
                rootLayout.setCenter(processingScreen);
                ProcessingScreenController controller = loader.getController();
                controller.setMainApp(this);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

1 个答案:

答案 0 :(得分:0)

除非您以某种方式暂停执行,否则程序将继续执行,并基本上跳过显示处理屏幕。要在一段时间内显示处理屏幕,您需要使用animation并在动画完成后显示报告屏幕。请注意,下面的代码只是您的最终结果可能看起来并且无法编译的概述。

Transition transition;
// Set up your transition or animation
transition = buildTransition();
// Show your processing screen within the transition
showProcessingScreen();
transition.setOnFinished(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent arg0) {
        Report.findAppliedJars();
        mainApp.showReportingScreen();
    }       
});

如果您在处理屏幕显示时尝试在后台加载某些内容,则必须使用concurrency。如果你走这条路线,代码应该与上面类似,除非你使用Task classsetOnSucceeded method。还有其他方法可以执行此操作,但我相信这是最简单的方法。