Действие кнопки в JavaFX выполняется в неправильной последовательности

#java #button #controller #javafx #initialization

#java #кнопка #контроллер #javafx #инициализация

Вопрос:

Обновление 1: вот более интересная вещь. Когда я удаляю последнюю строку { mainapp.showReportingScreen();}, теперь программа сначала выполняет метод findapplliedjars, а затем показывает экран обработки.


Я работаю в JavaFX и борюсь с действиями кнопки. Я хочу, чтобы при нажатии этой кнопки:

  1. сделайте что-нибудь;
  2. показать другой экран;
  3. сделайте другое;
  4. показать другой экран;

Но моя программа пропускает 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. Можете ли вы опубликовать код для processingScreen ?

2. Вероятно, выполнение не остановлено при отображении вашего экрана обработки

3. Я опубликую код через некоторое время.

Ответ №1:

Если вы каким-то образом не приостановите выполнение, программа продолжит выполнение и, по сути, пропустит показ вашего экрана обработки. Чтобы показывать экран обработки в течение определенного времени, вам нужно использовать анимацию и показывать экран отчета после завершения анимации. Обратите внимание, что приведенный ниже код представляет собой лишь краткое описание того, как может выглядеть ваш конечный результат, и не компилируется.

 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();
    }       
});
  

Если вы пытаетесь загрузить что-то в фоновом режиме во время отображения экрана обработки, вам придется использовать параллелизм. Если вы пойдете по этому пути, код должен выглядеть аналогично приведенному выше, за исключением того, что вы будете использовать класс Task и метод setOnSucceeded . Существуют и другие способы выполнения этой операции, но я считаю, что это самый простой способ.

Комментарии:

1. На самом деле метод findapplliedjars занимает некоторое время. Поэтому я подумал, что во время работы этого метода должен быть виден processingscreen. Теперь я жду завершения метода findapplliedjars, затем появляется экран отчетов.

2. Да, в этом случае вам нужно использовать класс Task.