Обработчик событияв JavaFX класс или интерфейс - PullRequest
1 голос
/ 20 января 2012

Я выбрал базовый пример печати «Hello World» на экране при нажатии мыши. Код выглядит следующим образом.

package sample;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

/**
 *
 * @author gauravp
 */
public class Sample extends Application {

    /**
     * @param args the command line arguments
     */
    Button btn = new Button("ok");
    //Label l = new Label("Done");

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        primaryStage.setTitle("First Stage");


        //Created anonymous inner class EventHandler<ActionEvent>
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {

                    System.out.print("Hello World !!");


            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

В документации упоминается, что EventHandler - это интерфейс, но какдавай создадим экземпляр интерфейса ...

"new EventHandler ()"

В большом замешательстве .... пожалуйста, ответьте, если у вас есть идеи .. Вотссылка для интерфейса EventHandler: http://docs.oracle.com/javafx/2.0/api/javafx/event/EventHandler.html

Ответы [ 2 ]

4 голосов
/ 20 января 2012

Синтаксис

    new EventHandler<ActionEvent>() {
        @Override // <- notice the annotation, it overrides from the interface.
        public void handle(ActionEvent event) {
                System.out.print("Hello World !!");
        }
    }

создает «анонимный внутренний класс», который реализует EventHandler, и определяет метод handle. Если вы проверите классы, сгенерированные при компиляции проекта, вы, вероятно, найдете файл класса с именем Sample $ 1 (или аналогичный), который является классом, сгенерированным для этого кода.

Вы можете прочитать о внутренних (анонимных) классах здесь: http://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html

Чтобы ответить на ваш вопрос: EventHandler - это интерфейс, и этот код фактически не создает его экземпляр, а создает экземпляр недавно объявленного анонимного класса.

1 голос
/ 20 января 2012

То, что вы видите, есть анонимный внутренний класс .

Это реализация интерфейса "на месте", без создания отдельного класса с именем, которое реализует интерфейс.

Анонимные внутренние классы часто используются для обработчиков событий компонентов GUI, как показывает ваш пример кода.

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