Java - 在一段时间后等待空间或返回

时间:2013-06-06 00:50:49

标签: java swing

我的Java程序中有一个函数,等待用户按下空格键。我想修改它,以便在经过一定时间并且仍然没有按下空格时函数也会返回。

我想保持这个功能,不要改变风格,所以我真的很感激修改这个功能的答案。谢谢!

public void waitForSpace() {
        final CountDownLatch latch = new CountDownLatch(1);
        KeyEventDispatcher dispatcher = new KeyEventDispatcher() {
            public boolean dispatchKeyEvent(KeyEvent e) {
                if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_SPACE) {
                    latch.countDown();
                }
                return false;
            }
        };
        KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
        try {
            //current thread waits here until countDown() is called (see a few lines above)
            latch.await();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }  
        KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
    }

2 个答案:

答案 0 :(得分:2)

尝试使用CountDownLatch#await(long, TimeUnit)代替......

public void waitForSpace() {
    final CountDownLatch latch = new CountDownLatch(1);
    KeyEventDispatcher dispatcher = new KeyEventDispatcher() {
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getID() == KeyEvent.KEY_PRESSED && e.getKeyCode() == KeyEvent.VK_SPACE) {
                latch.countDown();
            }
            return false;
        }
    };
    KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(dispatcher);
    try {
        //current thread waits here until countDown() is called (see a few lines above)
        latch.await(30, TimeUnit.SECONDS);
    } catch (InterruptedException e1) {
        e1.printStackTrace();
    }  
    KeyboardFocusManager.getCurrentKeyboardFocusManager().removeKeyEventDispatcher(dispatcher);
}

答案 1 :(得分:1)

我相信您需要使用ExecturerService和Future来实现这一目标。您可以设置将来的执行时间来完成自己。您需要在Thread类的run方法中包装代码以等待用户输入。一旦你这样做并假设你把你称为任务,那么你可以这样做:

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<String> future = executor.submit(new Task());

        try {
            System.out.println("Started..");
            System.out.println(future.get(5, TimeUnit.SECONDS));
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            System.out.println("Terminated!");
        }

        executor.shutdownNow();
    }
}

根据需要修改代码。