【问题标题】:Java key listener press onceJava键监听器按下一次
【发布时间】:2012-12-27 20:46:51
【问题描述】:

我的程序中有一个按键监听器,对于大多数按键,我希望用户能够按住按键。但是截图的键我希望用户能够按住键但只截取一张截图有什么想法吗?

package me.bevilacqua.game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

public class InputHandler implements KeyListener{

    private boolean[] keys = new boolean[120];
    public boolean up , down , left , right , screen_shot;

    public void tick() {
        up =  keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];    //Will be Jump
        down =  keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];  //Will not be down but maybe slide or better yet action key or maybe shoot
        left =  keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
        right =  keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];    
        screen_shot = keys[KeyEvent.VK_F5] || keys[KeyEvent.VK_BACK_SLASH];
    }

    public void keyPressed(KeyEvent e) {
        keys[e.getKeyCode()] = true;
    }

    public void keyReleased(KeyEvent e) {
        keys[e.getKeyCode()] = false;
    }

    public void keyTyped(KeyEvent e) {  
    }
}

编辑:

为什么这不起作用:

package me.bevilacqua.game;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Timer;


public class InputHandler implements KeyListener{
private boolean[] keys = new boolean[120];
public long current , last = -1;
public boolean up , down , left , right , screen_shot;
public boolean shotFlag = true; //True if allowed

public void tick() {
    up =  keys[KeyEvent.VK_UP] || keys[KeyEvent.VK_W];    //Will be Jump
    down =  keys[KeyEvent.VK_DOWN] || keys[KeyEvent.VK_S];  //Will not be down but maybe slide or better yet action key or maybe shoot
    left =  keys[KeyEvent.VK_LEFT] || keys[KeyEvent.VK_A];
    right =  keys[KeyEvent.VK_RIGHT] || keys[KeyEvent.VK_D];    
    screen_shot = keys[KeyEvent.VK_F5];
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() != KeyEvent.VK_F5) keys[e.getKeyCode()] = true;
    else if (e.getKeyCode() == KeyEvent.VK_F5 && shotFlag) {
        keys[e.getKeyCode()] = true;
        shotFlag = false;
    }


}

public void keyReleased(KeyEvent e) {
    keys[e.getKeyCode()] = false;
    if(e.getKeyCode() == KeyEvent.VK_F5) shotFlag = true;
}

public void keyTyped(KeyEvent e) {  
}

}

【问题讨论】:

  • 所以,您的系统中有一个标志来停止键重复,但是对于某些键,您希望允许这些重复发生,对吗?
  • 目前所有键都重复,我需要添加一个标志以防止某些键重复
  • 这似乎是一个设计问题。 tick() 方法是如何使用的?
  • 您的听众正在阻止屏幕截图键重复。您可以检查屏幕截图的按键按下事件并启动某种计时器,每隔“n”个周期触发一次,拍摄屏幕截图,直到按键被释放...
  • 从此代码无法回答,为了获得更好的帮助,请尽快发布SSCCE,如果GUI基于Swing,请查看KeyBindings

标签: java keyboard awt keylistener


【解决方案1】:

据我了解,当按住相应的键时,与每个键关联的操作都会重复,并且您想要阻止其中一个操作重复,即使在相应的键被按住时也是如此。我认为您可以通过在调用keyPressed() 时设置一个附加标志来解决此问题。然后screen_shot 仅在设置此标志时在tick() 中设置并且 每次调用tick() 时(当然在读取其值之后)该标志都未设置。或者,您可以仅在设置标志并且设置screen_shot 标志时取消设置该标志。我认为这两种方式都没有任何区别。

【讨论】:

    【解决方案2】:

    你可以这样试试:

    public boolean up = false;
    public boolean down = false;
    public boolean left = false;
    public boolean right = false;    
    public boolean screen_shot = false;
    
    //...
    
    f.addKeyListener(new KeyAdapter()
            {
                public void keyPressed(KeyEvent e)
                {
                    if (e.getKeyCode() == KeyEvent.VK_D)
                    {
                        right = true;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_A)
                    {
                        left = true;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_S)
                    {
                        down = true;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_W)
                    {
                        up = true;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_F5)
                    {
                        screen_shot = true;
                    }
                }
                public void keyReleased(KeyEvent e)
                {
                    if (e.getKeyCode() == KeyEvent.VK_D)
                    {
                        right = false;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_A)
                    {
                        left = false;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_S)
                    {
                        down = false;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_W)
                    {
                        up = false;
                    }
                    if (e.getKeyCode() == KeyEvent.VK_F5)
                    {
                        screen_shot = false;
                    }
                }
    //...
    
    @Override
        protected void paintComponent(Graphics g)
        {
            super.paintComponent(g);
            this.setBackground(Color.white);
            g.drawImage(character, characterLocation.x, characterLocation.y, this);
    
            if (right)
            {
                characterLocation.x += 1;
            }
            if (left)
            {
                characterLocation.x -= 1;
            }
            if (down)
            {
                characterLocation.y += 1;
            }
            if (up)
            {
                characterLocation.y -= 1;
            }
            if (screen_shot)
            {
                BufferedImage shot = character.createScreenCapture(new Rectangle(100,100));
            }
            repaint();
        }   
    }
    

    可能无法达到标准,因为您可能需要更改上面屏幕截图的“if”语句。

    【讨论】:

      猜你喜欢
      • 2011-08-07
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2012-04-29
      相关资源
      最近更新 更多