【问题标题】:Using Jinput to pop up a JFrame WIndow alarm使用Jinput弹出一个JFrame WINdow告警
【发布时间】:2012-11-14 12:32:40
【问题描述】:

在 Netbeans 中使用 Jinput 和 Java,我正在做一个非常小的项目,当假设用户按下键盘上的 'K' 并终止 @ 时,它只会弹出一个 JFrame 警报窗口当用户松开'k' 时,987654324@ 报警窗口。在我的代码中,我似乎陷入了 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();

【问题讨论】:

    标签: java swing timer jinput


    【解决方案1】:

    如果你只是想打开和关闭窗口,可以使用定时器吗? 你有一个非常复杂的代码,用于一个简单的任务。 你可以添加一个 ComponentListener 到你的 JFrame 来隐藏,像这样:

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

    【讨论】:

    • 我实际上在做一个更大的项目,但我把它缩小了,以便更好地理解它。我的目标是用户按下一个字母并弹出一个 JFrame,当用户放手时 JFrame 被释放。自上一篇文章以来我一直在研究它,这是我的代码:
    • 所以当它失去焦点时你不能处理它吗?
    • 我无法从我的 ActionPerformed 块中处理 JFrame。我在我的第一篇文章中发布了我更新的代码......如果这些听起来很愚蠢,请道歉,我是新手。
    猜你喜欢
    • 1970-01-01
    • 2015-08-07
    • 2018-06-17
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多