【问题标题】:How to restrict the user from interacting with the program for a certain period of time?如何在一定时间内限制用户与程序交互?
【发布时间】:2016-09-01 07:26:48
【问题描述】:

我试图在一段时间内限制用户与程序交互,但遗憾的是,没有成功。我尝试过使用Thread.sleep,但是一旦sleep 操作结束,用户的输入就会赶上并继续执行直到完成。

例如,如果我使用下面的代码,程序会像上面提到的那样运行:它会在提供的时间段(1,5 秒)内休眠,然后用户的操作会赶上(它会打印“等待后”Thread.sleep 处于活动状态时用户单击的次数一样多)。那么我将如何防止这种情况呢?任何建议将不胜感激。

public void mouseClicked(MouseEvent e) {
        print();
    }

public void print() {
    System.out.println("After waiting.");
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

【问题讨论】:

  • 一种方法是保留要启用/禁用的组件/元素的列表。然后使用计时器。禁用列表中的所有内容,然后触发启用列表中所有内容的事件。
  • 我认为你最好使用“glasshour”模式对话框。这是文档:docs.oracle.com/javase/tutorial/uiswing/misc/modality.html 这是相关的 SO QA:stackoverflow.com/questions/20269083/…
  • 你的想法错了。您应该改变程序响应用户尝试交互的方式,而不是从字面上阻止用户向程序提供任何输入。也就是说,继续接受用户的输入,然后忽略输入,或者更好:提供某种反馈,意思是“是的,我能听到你的声音,但我忽略了你,因为我现在很忙。”

标签: java multithreading frame


【解决方案1】:

原因是Thread.sleep() 会阻塞UI Thread。因此,通过第一次单击,您将获得一个输出,并且您的应用程序将存储以下事件,以便在睡眠期间再次单击。然后,在您的 GUI 线程从睡眠中恢复后,事件被释放并执行一些打印提示,直到它进入睡眠状态。因为

阻塞 UI-Thread 并不是一件小事。如果您想阻止用户输入,您应该禁用触发事件的按钮或节点,并在其处理完成时启用它。

【讨论】:

  • 虽然我认为您是正确的,但我仍然不知道如何阻止用户输入。我正在创建游戏“Boom Dots”的复制品(你是一个会射出其他球的球。如果你错过 - 你会死,如果你击中它 - 你得分并产生另一个是时候做同样的事情了)。所以我想要做的是,用户的点击不会被注册,球不会回到他的起始位置(他的 Y 坐标不会改变)。我该怎么做呢?点击here(起始类)和here(点类)获取代码。
  • 我认为在这种情况下,我会尝试在您的点中使用布尔标志来解决这个问题。如果您触发了点,请先将其设置为 true 或 false 并阻止进一步的操作。要允许进一步的用户操作,请确定将标志设置为真/假的点。
  • 我正在考虑这样做。我会试试的。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2012-05-06
相关资源
最近更新 更多