Java 与keyListener有问题

Java 与keyListener有问题,java,swing,keylistener,thread-sleep,focusable,Java,Swing,Keylistener,Thread Sleep,Focusable,我试图用java做一个简单的反应测试。 当屏幕变绿时,我按下空格开关,将“点击”变为假,并停止测量时间的循环。 实际上,键列表器什么都不做。 我是否要将keay侦听器添加到正确的组件(jpanel面板)? 还有其他问题吗 import java.awt.Color; import java.awt.RenderingHints.Key; import java.awt.event.ActionEvent; import java.awt.event.ActionL

我试图用java做一个简单的反应测试。 当屏幕变绿时,我按下空格开关,将“点击”变为假,并停止测量时间的循环。 实际上,键列表器什么都不做。 我是否要将keay侦听器添加到正确的组件(jpanel面板)? 还有其他问题吗

    import java.awt.Color;
    import java.awt.RenderingHints.Key;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;        
    import javax.swing.*;

    public class mainCheck {
    // //////////////////////////////////////
    public static void timeKeeper() {
         boolean clicked=false;
        long time = 10000;
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        panel.setBackground(Color.GREEN);
        while (time > 0 && !clicked) {
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            time--;
        }
        panel.setBackground(Color.gray);
        long time2= 10000-time;
        JLabel x = new JLabel("" +time2+"");
        panel.add(x);    
    }

    // //////////////////////////////////////
    static boolean clicked;
    JFrame frame;
    static JPanel panel;

    public mainCheck() {
        frame = new JFrame();
        panel = new JPanel();
        clicked = false;
        Handler handler = new Handler();
        frame.addKeyListener(handler);
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500,500);
        frame.setVisible(true);
    }
    // //////////////////////////////////////

    public static void main(String[] args) {
        mainCheck f = new mainCheck();
        panel.getActionMap();           
        f.timeKeeper();
    }

    // //////////////////////////////////////
    public class Handler implements KeyListener {

        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
        }

        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub    
        }

        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub
            if (e.getKeyCode() == KeyEvent.VK_SPACE) {
                clicked = false;
                System.out.println("space pressed");
            }    
        }    
    }
}
  • 不要使用
    Thread.sleep(5000);
    block,在睡眠期间,您可能会将所有事件丢失到已经可见的Swing GUI

  • 改用

  • Thread.sleep(1);
    对于本机操作系统中的空间环境、非人类、极短时间的攻击延迟(8-14毫秒,取决于本机操作系统),可能是适当的延迟

  • JLabel x=new JLabel(“+time2+”);
    panel.add(x);
    在AWT/Swing中并不是任何通知程序,说明部分
    JComponents
    被删除或添加,必须通知使用的
    LayoutManager
    JPanel
    在API中有
    FlowLayou
    t)通过使用方法
    重新验证
    重新喷漆
    ,例如

  • Swing GUI应在上创建

  • 不要改为使用,否则您(是焦点搜寻者)需要设置
    panel.seFocusable(true);


    • 使用Thread.sleep()来减少时间值是一个非常糟糕的主意。 改用
      计时器
      对象:

      public void myTimer(){
          Timer myTimer = new Timer(delay, new ActionListener(){
              public void actionPerformed(ActionEvent e){
                  //Stuff to do
              }
          });
      }
      
      其中
      delay
      是您延迟计时器的时间量。您可以使用myTimer.start()启动计时器;

      • 问题是您“e.getKeyCode()”总是“0”所以 更改为“e.getKeyChar()”和“(char)32
      • 另一个问题是,您将clicked=false设置为 “正确
      • 最后一个问题是“timeKeeper()”必须删除“boolean”,因为它已经声明了

        Bad
        public static void timeKeeper() {
        boolean clicked=false
        ....}
        
        Good
        public static void timeKeeper() {
        clicked=false
        ....}
        
      这是正确的代码:

      import java.awt.Color;
      import java.awt.event.*;        
      import javax.swing.*;
      
      public class mainCheck {
      // //////////////////////////////////////
      public static void timeKeeper() {
          clicked=false;
          long time = 10000;
          try {
              Thread.sleep(5000);
          } catch (InterruptedException e1) {
              // TODO Auto-generated catch block
              e1.printStackTrace();
          }
          panel.setBackground(Color.GREEN);
          while (time > 0 && !clicked) {
              try {
                  Thread.sleep(1);
              } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              time--;
          }
          panel.setBackground(Color.gray);
          long time2= 10000-time;
          JLabel x = new JLabel("" +time2+"");
          panel.add(x);    
      }
      
      // //////////////////////////////////////
      static boolean clicked;
      JFrame frame;
      static JPanel panel;
      Handler handler = new Handler();
      
      public mainCheck() {
          frame = new JFrame();
          panel = new JPanel();
          clicked = false;
      
          frame.addKeyListener(handler);
          frame.add(panel);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setSize(500,500);
          frame.setVisible(true);
      }
      // //////////////////////////////////////
      
      public static void main(String[] args) {
          mainCheck f = new mainCheck();
          panel.getActionMap();           
          f.timeKeeper();
      }
      
      // //////////////////////////////////////
      public class Handler implements KeyListener {
      
          @Override
          public void keyPressed(KeyEvent e) {
              // TODO Auto-generated method stub
          }
      
          @Override
          public void keyReleased(KeyEvent e) {
              // TODO Auto-generated method stub    
          }
      
          @Override
          public void keyTyped(KeyEvent e) {
              if (e.getKeyChar() == (char)32) {
                  clicked = true;
                  System.out.println("space pressed");
              }    
          }  
      }
      }
      

      -1使用计时器的建议是在30分钟前给出的。没有必要用重复的建议扰乱论坛。
      import java.awt.Color;
      import java.awt.event.*;        
      import javax.swing.*;
      
      public class mainCheck {
      // //////////////////////////////////////
      public static void timeKeeper() {
          clicked=false;
          long time = 10000;
          try {
              Thread.sleep(5000);
          } catch (InterruptedException e1) {
              // TODO Auto-generated catch block
              e1.printStackTrace();
          }
          panel.setBackground(Color.GREEN);
          while (time > 0 && !clicked) {
              try {
                  Thread.sleep(1);
              } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
              time--;
          }
          panel.setBackground(Color.gray);
          long time2= 10000-time;
          JLabel x = new JLabel("" +time2+"");
          panel.add(x);    
      }
      
      // //////////////////////////////////////
      static boolean clicked;
      JFrame frame;
      static JPanel panel;
      Handler handler = new Handler();
      
      public mainCheck() {
          frame = new JFrame();
          panel = new JPanel();
          clicked = false;
      
          frame.addKeyListener(handler);
          frame.add(panel);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.setSize(500,500);
          frame.setVisible(true);
      }
      // //////////////////////////////////////
      
      public static void main(String[] args) {
          mainCheck f = new mainCheck();
          panel.getActionMap();           
          f.timeKeeper();
      }
      
      // //////////////////////////////////////
      public class Handler implements KeyListener {
      
          @Override
          public void keyPressed(KeyEvent e) {
              // TODO Auto-generated method stub
          }
      
          @Override
          public void keyReleased(KeyEvent e) {
              // TODO Auto-generated method stub    
          }
      
          @Override
          public void keyTyped(KeyEvent e) {
              if (e.getKeyChar() == (char)32) {
                  clicked = true;
                  System.out.println("space pressed");
              }    
          }  
      }
      }