JavaFX Stage 单机和双击事件

在JavaFX中,Stage是JavaFX应用程序的顶级容器,用于包含应用程序的用户界面。Stage可以包含多个Scene,每个Scene又包含多个Node。在JavaFX中,我们可以为Stage添加事件处理器来响应用户的操作,包括单击和双击事件。

单机事件

当用户在Stage上单击鼠标时,可以触发单击事件。我们可以为Stage添加MouseEvent事件处理器来处理单击事件。下面是一个简单的JavaFX程序,添加了单击事件处理器:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class ClickEventExample extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Click me!");
        StackPane root = new StackPane();
        root.getChildren().add(label);

        Scene scene = new Scene(root, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Click Event Example");

        // 添加单击事件处理器
        scene.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                System.out.println("Mouse clicked");
            }
        });

        primaryStage.show();
    }

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

在上面的示例中,我们创建了一个Label,并将其添加到StackPane中,然后将StackPane添加到Scene中。我们为Scene添加了一个单击事件处理器,当用户单击鼠标时,会打印出"Mouse clicked"。

双击事件

JavaFX并没有提供直接支持双击事件的方法,但我们可以通过组合单击事件来实现双击事件。下面是一个示例程序,演示如何实现双击事件:

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class DoubleClickEventExample extends Application {

    private long lastClickTime = 0;
    private int clickCount = 0;

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label("Double click me!");
        StackPane root = new StackPane();
        root.getChildren().add(label);

        Scene scene = new Scene(root, 200, 200);
        primaryStage.setScene(scene);
        primaryStage.setTitle("Double Click Event Example");

        scene.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                long now = System.currentTimeMillis();
                if (now - lastClickTime < 300) {
                    clickCount++;
                } else {
                    clickCount = 1;
                }

                if (clickCount == 2) {
                    System.out.println("Double clicked");
                    clickCount = 0;
                }

                lastClickTime = now;
            }
        });

        primaryStage.show();
    }

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

在上面的示例中,我们记录了每次单击事件发生的时间,并根据两次单击事件之间的时间间隔来判断是否为双击事件。如果两次单击事件的时间间隔小于300毫秒,则认为是双击事件。

类图

下面是示例程序中使用的类的类图:

classDiagram
    class ClickEventExample {
        - Label label
        - StackPane root
        - Scene scene
        - primaryStage
        + start()
        + main()
    }

    class DoubleClickEventExample {
        - long lastClickTime
        - int clickCount
        - Label label
        - StackPane root
        - Scene scene
        - primaryStage
        + start()
        + main()
    }

以上是关于JavaFX Stage单击和双击事件的介绍。通过添加相应的事件处理器,我们可以方便地响应用户的单击和双击操作。希望这篇文章能够帮助你更好地理解JavaFX中的事件处理机制。