2013-06-06 37 views
1

我在我的Java程序中有一个等待用户按空格键的功能。我想修改这个函数,这样如果一段时间过去了,空间还没有被按下,函数也会返回。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); 
    } 
+0

我看不出如何做到这一点的工作。 Swing是单线程环境,所以如果阻塞,等待用户输入,EDT无法处理关键事件......? – MadProgrammer

+2

['CountDownLatch#await(long,TimeUnit)'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html#await%28long,%20java.util .concurrent.TimeUnit 29%)? – MadProgrammer

+0

@MadProgrammer,我从来没有用过CountDownLatch,所以我只是做了一些游戏。如果您从EDT调用waitForSpace(),则它不响应空格键。如果您从线程调用该方法,那么它会响应空格键。在这两种情况下指定超时工作。您应该添加您的超时建议作为答案。 – camickr

回答

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

我相信你需要使用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(); 
    } 
} 

修改代码根据您的需要。

+0

如何使用swingworker? – nachokk

相关问题