使用Jinput弹出JFrame WIndow警报

时间:2012-11-14 12:32:40

标签: java swing timer jinput

在Netbeans中使用Jinput和Java,我正在开发一个非常小的项目,只需弹出一个JFrame警报窗口,当我们让用户按下'K'时当用户放开JFrame时,键盘会终止'k'警报窗口。在我的代码中,我似乎陷入了while循环,因为JFrame在第一次按下时打开,似乎无法关闭。我研究过,发现使用javax.swing.Timer是更好的方法。然而,由于我是这方面的新手,使用计时器的所有不同方式让我更加困惑。有人可以看看我的代码并指出我正确的方向吗?

这是我的代码;

public void startPolling() {
    while(true) {
        ControllerEnvironment.getDefaultEnvironment().getControllers();                
        ca[index].poll();  
        EventQueue queue = ca[index].getEventQueue();
        Event event = new Event();
        while(queue.getNextEvent(event)) {
           StringBuffer buffer = new StringBuffer(ca[index].getName());
           buffer.append(" at ");
           buffer.append(event.getNanos()).append(", ");
           Component comp = event.getComponent();


           buffer.append(comp.getName()).append(" changed to ");
           float value = event.getValue(); 
           if(comp.isAnalog()) {
              buffer.append(value);
           } else {
              if(value==1.0f) {
                 buffer.append("On");
                 if ("K".equals(comp.getName())){
                    alarmBox();
                 }
              } else {
                 buffer.append("Off");
                 if ("K".equals(comp.getName())){
                    alarmBox.setVisible(false);
                 }
              }
           }
           System.out.println(buffer.toString());
        }
  }      
}

alarmBox()是我的JFrame。

我正在研究它,这是我的更新代码:

public void startPolling(){

    Timer timer = new Timer(50, new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            ca[index].poll();  
        EventQueue queue = ca[index].getEventQueue();
        Event event = new Event();
        while(queue.getNextEvent(event)) {
           StringBuffer buffer = new StringBuffer(ca[index].getName());
           buffer.append(" at ");
           buffer.append(event.getNanos()).append(", ");
           Component comp = event.getComponent();

           buffer.append(comp.getName()).append(" changed to ");
           float value = event.getValue(); 
           if(comp.isAnalog()) {
              buffer.append(value);
           } else {
              if(value==1.0f) {
                 buffer.append("On");
                 if ("K".equals(comp.getName())){
                    alarmBox();

                 }
              } else {
                 buffer.append("Off");
                 if ("K".equals(comp.getName())){
                    alarmBox.dispose();
                 }
              }
           }
           System.out.println(buffer.toString());
        }

     try {
        Thread.sleep(20);
     } catch (InterruptedException f) {
        f.printStackTrace();
     }


        }

}); timer.start();

1 个答案:

答案 0 :(得分:0)

如果你只想打开和关闭窗口,是否要使用计时器? 对于一项简单的任务,你有一个非常复杂的代码。 您可以向JFrame添加一个组件侦听器来隐藏,如下所示:

frame.addComponentListener(new ComponentAdapter(){

 public void componentMoved(ComponentEvent e) {
     if (popup.isVisible()){
         popup.setVisible(false);
     }
  }
  });