当前位置: 首页 > 面试题库 >

JavaFX 2用户空闲检测

利海阳
2023-03-14
问题内容

我正在尝试使用JavaFX作为UI制作一个简单的Java交易应用。
我现在想要做的是从具有1个主要阶段和许多场景的应用程序中检测用户空闲状态。

示例:如果用户闲置了3分钟,则返回主菜单。

我已经在网络上尝试过一些有关如何检测JavaFX空闲状态的示例,但是我发现的始终是-一种在所有场景中都发生的功能空闲状态检测-
这种方法对交易应用程序(我认为)很危险(例如:应用程序检测交易过程中处于闲置状态)。
是否可以在每个场景中检测用户空闲状态?怎么样?
谢谢。

编辑:

我已经尝试过的示例:

http://tomasmikula.github.io/blog/2014/06/04/timers-in-javafx-and-
reactfx.html

http://ochafik.com/blog/?p=98


问题答案:

我不太了解您对交易行为的看法。事务关注有关数据的保证,您的事务行为应在数据级别定义,并且不受UI中发生的事情的影响。换句话说,即使UI由于用户闲置而重置,您的原子行为也应完成或回滚。

也许这会有所帮助。(请注意,我在这些示例中使用了Java 8代码,但是如果需要,您可以轻松地使其兼容JavaF 2.2。)这遵循Tomas
Mikula的一般方法,即使用a Timeline来实现空闲检查。我没有使用Tomas的FX
Timer包装器,但是如果您愿意,您当然可以使用。此类封装了用于监视用户是否空闲的监视器。您可以注册任何节点(或场景)和事件类型:如果该类型的事件在该节点(或场景)上发生,则确定用户没有空闲。如果经过指定的时间却未发生任何注册事件,则将执行所提供的可运行对象(在FX
Application线程上)。这使您可以灵活地创建多个监视器(如果需要),并为每个监视器注册一个或多个节点。

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.scene.Node;
import javafx.scene.Scene;

import javafx.util.Duration;

public class IdleMonitor {

    private final Timeline idleTimeline ;

    private final EventHandler<Event> userEventHandler ;

    public IdleMonitor(Duration idleTime, Runnable notifier, boolean startMonitoring) {
        idleTimeline = new Timeline(new KeyFrame(idleTime, e -> notifier.run()));
        idleTimeline.setCycleCount(Animation.INDEFINITE);

        userEventHandler = e -> notIdle() ;

        if (startMonitoring) {
            startMonitoring();
        }
    }

    public IdleMonitor(Duration idleTime, Runnable notifier) {
        this(idleTime, notifier, false);
    }

    public void register(Scene scene, EventType<? extends Event> eventType) {
        scene.addEventFilter(eventType, userEventHandler);
    }

    public void register(Node node, EventType<? extends Event> eventType) {
        node.addEventFilter(eventType, userEventHandler);
    }

    public void unregister(Scene scene, EventType<? extends Event> eventType) {
        scene.removeEventFilter(eventType, userEventHandler);
    }

    public void unregister(Node node, EventType<? extends Event> eventType) {
        node.removeEventFilter(eventType, userEventHandler);
    }

    public void notIdle() {
        if (idleTimeline.getStatus() == Animation.Status.RUNNING) {
            idleTimeline.playFromStart();
        }
    }

    public void startMonitoring() {
        idleTimeline.playFromStart();
    }

    public void stopMonitoring() {
        idleTimeline.stop();
    }
}

这是一个测试。“开始”按钮可能是登录的替代方法。主UI具有一个带有两个选项卡的选项卡窗格:每个单独的选项卡均以其自己的“开始”按钮开头,然后主要内容具有标签,文本字段和按钮。

每个选项卡的内容都有一个(简短的,用于测试的)空闲监视器。选项卡内容上的任何事件都将重置空闲监视器,但选项卡内容之外的事件不会将其重置。整个窗口还有一个“全局”空闲监视器,可在30秒后重置整个UI。

请注意,数据将被保留:即,如果由于空闲而超时,则在文本字段中键入的任何文本都会被正确保留。这就是为什么我认为“交易”问题根本不重要的原因。

import javafx.application.Application;
import javafx.event.Event;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class IdleTest extends Application {

    @Override
    public void start(Stage primaryStage) {

        StackPane root = new StackPane();

        Parent mainUI = buildMainUI();
        Scene scene = new Scene(root, 350, 150);
        Parent startUI = buildStartUI(() -> root.getChildren().setAll(mainUI));
        root.getChildren().add(startUI);

        IdleMonitor idleMonitor = new IdleMonitor(Duration.seconds(30),
                () -> root.getChildren().setAll(startUI), true);
        idleMonitor.register(scene, Event.ANY);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Parent buildStartUI(Runnable start) {
        Button button = new Button("Start");
        button.setOnAction(e -> start.run());
        StackPane root = new StackPane(button);
        return root ;
    }

    private Parent buildMainUI() {
        TabPane tabPane = new TabPane();
        Tab tab1 = new Tab("One");
        Parent tab1Content = buildTabUI("Tab 1");
        Parent tab1StartContent = buildStartUI(() -> tab1.setContent(tab1Content));
        tab1.setContent(tab1StartContent);
        IdleMonitor tab1IdleMonitor = new IdleMonitor(Duration.seconds(5), 
                () -> tab1.setContent(tab1StartContent), true);
        tab1IdleMonitor.register(tab1Content, Event.ANY);

        Tab tab2 = new Tab("Two");
        Parent tab2Content = buildTabUI("Tab 2") ;
        Parent tab2StartContent = buildStartUI(() -> tab2.setContent(tab2Content));
        tab2.setContent(tab2StartContent);
        IdleMonitor tab2IdleMonitor = new IdleMonitor(Duration.seconds(10),
                () -> tab2.setContent(tab2StartContent), true);
        tab2IdleMonitor.register(tab2Content, Event.ANY);

        tabPane.getTabs().addAll(tab1, tab2);
        return tabPane ;
    }

    private Parent buildTabUI(String text) {
        Button button = new Button("Click here");
        button.setOnAction(e -> System.out.println("Click in "+text));
        VBox content = new VBox(10, new Label(text), new TextField(), button);
        content.setAlignment(Pos.CENTER);
        return content ;
    }

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


 类似资料:
  • 我正在开发一个将在Kiosk模式下运行的应用程序。在这个应用程序中,如果用户在5分钟内没有在应用程序中做任何事情,应用程序将显示一个屏幕保护程序,这是应用程序的徽标。 我的问题是,如何在5分钟内检测到空闲代码?

  • 问题内容: 如何在Go HTTP客户端中使空闲超时? 空闲超时意味着从HTTP客户端内部调用Conn接口的Read / Write方法时发生超时。当客户端下载文件并且由于读取超时而导致下载失败时,此功能很有用。 问题答案: 您需要创建自己的,并返回,以设置适当的读写期限。 该会是这个样子:

  • 文件系统负责将空闲块分配给文件,因此它必须跟踪磁盘中存在的所有空闲块。 主要有两种方法,使用它们管理磁盘中的空闲块。 1. 位向量 在这种方法中,空闲空间列表被实现为位图向量。 它包含每个位代表每个块的位数。 如果该块为空,则该位为1,否则为0。最初,所有块都是空的,因此位图向量中的每个位都包含1。 随着空间分配的进行,文件系统开始为文件分配块并将各个位设置为。 2. 链接列表 这是空闲空间管理的

  • Spring Boot 1.5.x、Spring Boot 2.4.x、Apache Kafka 0.10.2 情况 问题 是否有Spring Boot/Spring Kafka正在设置的设置或属性会导致一两天内未使用空闲主题中的任何记录的用户从用户组中删除? 如果是,可以关闭吗?有什么缺点? 如果没有,是否有一种方法可以重新加入消费者组而不必重新启动服务?有什么缺点?

  • 本文向大家介绍如何使用JavaScript检测空闲的浏览器选项卡,包括了如何使用JavaScript检测空闲的浏览器选项卡的使用技巧和注意事项,需要的朋友参考一下 在某些情况下,当用户与我们的最终产品或应用程序进行交互时,我们发现自己会执行许多密集的,占用大量CPU的任务。启动轮询器,建立WebSocket连接,甚至加载视频或图片等媒体,都有可能成为性能障碍,尤其是当这些任务在不需要的情况下消耗资

  • 问题内容: 我想超时并杀死空闲的Redis客户端。有可以设置的设置吗?我似乎记得在某处设置配置,但似乎再也找不到了。 我希望这是自动完成的,而不是手动调用client kill命令。 问题答案: 查看Redis配置文件(用于启动Redis的文件)​​。 只需检查未注释掉的参数,然后更改超时参数以将非零值放入秒中即可。应该重新启动实例以考虑到此参数。 要在正在运行的Redis实例上更改此参数,可以使