如何在java桌面应用程序中停止无限循环以移动鼠标

时间:2018-04-11 20:12:59

标签: java jframe jbutton mouse infinite-loop

我试图创建一个桌面程序来移动鼠标,直到我按下例如字母" q"在java中。 我创建了一个窗口(JFrame),当我按下按钮时,鼠标开始移动。 我的疑问与这部分有关:

public void keyPressed(KeyEvent e) {
    if (e.getKeyCode() == KeyEvent.VK_Q) {
        System.exit(0);
    }
}

如何通过按字母来阻止这个无限循环?

def walkRight(r,c,walls):
    global Pwalk
    global rows
    global columns
    sum = 0
    if c == (columns-1) or [r,c+1] in walls:
        sum = sum + Pwalk * U[r][c]
    else:
        sum = sum + Pwalk * U[r][c+1]
    if r == 0 or [r-1,c] in walls:
        sum = sum + 0.5*(1-Pwalk) * U[r][c]
    else:
        sum = sum + 0.5*(1-Pwalk) *  U[r-1][c]
    if r == rows-1 or [r+1,c] in walls:
        sum = sum + 0.5*(1-Pwalk) * U[r][c]
    else:
        sum = sum + 0.5*(1-Pwalk) * U[r+1][c]
    return sum

为什么这不起作用? (我需要按一个字母,因为鼠标在程序运行时无法使用) 提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先,您可能不得不放弃事件处理程序。 如果在awt事件队列上运行while(true),那么你正在占用整个GUI,难怪它没有响应;从鼠标事件返回后才能触发其他事件。

你能提供更多代码吗?这还不足以解释这种行为。

您可能需要启动一个线程来执行此工作。

更新:

而不是同步调用JavaRobot();方法,您需要在一个线程中运行它。用于测试的丑陋黑客版本:

(new Thread(() -> JavaRobot())).start();

更干净的版本可能会将线程保存在变量中,因此您可以使用其他按钮来中断它。如果您不想自己处理线程但仍然在线程中运行任务,那么您也可以使用执行程序服务apis坚持下去。