Как обработать событие из другого класса в JavaFX? - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь иметь кнопку в классе Launcher и сделать функцию обработки в другом классе, как показано ниже.Однако, функция обработки, похоже, не работает.Ничего не напечатано.

Я думаю, что функция button.setOnAction (еще один класс) является причиной.В некоторых уроках говорится, что параметр setOnAction () - это то место, где я помещаю функцию обработки.Поэтому я поместил туда другой класс.

Я знаю, что могу просто сделать функцию обработки в том же классе или просто использовать лямбду.Тем не менее, я пытаюсь проверить, работает ли этот способ.


public class Launcher extends Application{
    public static Button button;
    AnotherClass anotherclass;
    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage myStage) throws Exception {
        button = new Button("Click me");
        button.setOnAction(anotherclass);

        StackPane layout = new StackPane();
        layout.getChildren().add(button);
        Scene scene = new Scene(layout, 300, 250);
        myStage.setScene(scene);
        myStage.show();

    }
}
public class AnotherClass implements EventHandler<ActionEvent>{
    @Override
    public void handle(ActionEvent event) {
        if(event.getSource()== Launcher.button) {   
            System.out.println("print");
        }
    }
}

Может кто-нибудь помочь мне сделать функцию обработки в другом классе, как у кнопки?

1 Ответ

0 голосов
/ 22 апреля 2019

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

Если вы используете этот отдельный AnotherClass для его обработки, вам просто нужно передать класс с ключевым словом new, чтобы фактически создать экземпляр класса:

button.setOnAction(new AnotherClass());

Однако это будет плохой дизайн по нескольким причинам:

  1. Вы выставляете свой Button через модификатор public. Это плохая идея и нарушает принципы инкапсуляции.
  2. Вы будете отделять логику своего приложения от пользовательского интерфейса довольно неинтуитивным образом, что усложнит его поддержку в будущем.

Я бы предложил использовать анонимный класс и лямбда-выражение в методе setOnAction():

button.setOnAction(event -> {
    System.out.println("print");
}

Это будет иметь тот же результат, что и ваша текущая реализация AnotherClass, но его легче читать, легче поддерживать, сохраняет логику для ваших кнопок в одном и том же коде и не требует от вас показа вашего Button публично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...