Java多键按下

Java多键按下,java,animation,user-interface,set,frame,Java,Animation,User Interface,Set,Frame,我试着把球移过一个框架。我有向上、向下、向左和向右的动作。但当我试着沿对角线移动时,它似乎不起作用。这是我的密码 首先我声明一些集合;按下是按下的键,其他键是向上和向左移动球的组合键,依此类推 public Set<Integer> pressed = new HashSet<>(); public Set<Integer> upLeft, upRight, downLeft, downRight; 下面是我处理按键和释放按键的方法: public sync

我试着把球移过一个框架。我有向上、向下、向左和向右的动作。但当我试着沿对角线移动时,它似乎不起作用。这是我的密码

首先我声明一些集合;按下是按下的键,其他键是向上和向左移动球的组合键,依此类推

public Set<Integer> pressed = new HashSet<>();
public Set<Integer> upLeft, upRight, downLeft, downRight;
下面是我处理按键和释放按键的方法:

public synchronized void formKeyPressed(java.awt.event.KeyEvent evt) {                                
        pressed.add(evt.getKeyCode());
        System.out.println("Added:"+evt.getKeyCode());

        if(pressed.size() == 1) {
            System.out.println("Size is 1");
            if(evt.getKeyCode() == evt.VK_UP) {
                if(y <= 25) {
                    y = 25;
                }
                else  {
                    y = y - yUpSpeed;
                }
            }
            if(evt.getKeyCode() == evt.VK_DOWN) {
                if(y >= (500-25)) {
                    y = (500-25);
                }
                else {
                    y = y + yDownSpeed;
                }
            }
            if(evt.getKeyCode() == evt.VK_LEFT) {
                if(x <= 0) {
                    x = 0;
                }
                else {
                    x = x - xLeftSpeed;
                }
            }
            if(evt.getKeyCode() == evt.VK_RIGHT) {
                if(x >= (500-25)) {
                    x = (500-25);
                }
                else {
                    x = x + xRightSpeed;
                }
            }
        }

        else if(pressed.size() == 2) {
            System.out.println("Size is 2");
            if(pressed.containsAll(upLeft)) {
                if(y <= 25) {
                    y = 25;
                }
                else  {
                    y = y - yUpSpeed;
                }
                if(x <= 0) {
                    x = 0;
                }
                else {
                    x = x - xLeftSpeed;
                }
            }
            if(pressed.containsAll(upRight)) {
                if(y <= 25) {
                    y = 25;
                }
                else  {
                    y = y - yUpSpeed;
                }
                if(x >= (500-25)) {
                    x = (500-25);
                }
                else {
                    x = x + xRightSpeed;
                }
            }
            if(pressed.containsAll(downLeft)) {
                if(y >= (500-25)) {
                    y = (500-25);
                }
                else {
                    y = y + yDownSpeed;
                }
                if(x <= 0) {
                    x = 0;
                }
                else {
                    x = x - xLeftSpeed;
                }
            }
            if(pressed.containsAll(downRight)) {
                if(y >= (500-25)) {
                    y = (500-25);
                }
                else {
                    y = y + yDownSpeed;
                }
                if(x >= (500-25)) {
                    x = (500-25);
                }
                else {
                    x = x + xRightSpeed;
                }
            }
        }
        else {
            System.out.println("Size is more than 2");
        }

    public synchronized void formKeyReleased(java.awt.event.KeyEvent evt) { 
            System.out.println("Removed:"+evt.getKeyCode());
            pressed.remove(evt.getKeyCode());
        }
public synchronized void formKeyPressed(java.awt.event.KeyEvent evt){
按下.add(evt.getKeyCode());
System.out.println(“添加:+evt.getKeyCode());
如果(按下.size()==1){
System.out.println(“大小为1”);
if(evt.getKeyCode()==evt.VK\u UP){
如果(y=(500-25)){
y=(500-25);
}
否则{
y=y+y下降速度;
}
}
if(evt.getKeyCode()==evt.VK_左){
如果(x=(500-25)){
x=(500-25);
}
否则{
x=x+x右速度;
}
}
}
else if(按.size()==2){
System.out.println(“大小为2”);
如果(按下。容器所有(英尺)){
如果(y=(500-25)){
x=(500-25);
}
否则{
x=x+x右速度;
}
}
}
否则{
System.out.println(“大小大于2”);
}
public synchronized void formkeyereleased(java.awt.event.KeyEvent evt){
System.out.println(“删除:+evt.getKeyCode());
按下.remove(evt.getKeyCode());
}

问题是,从debug system.out消息中,按下的集合的大小从未超过1。我做错了什么?

查看中的
键盘动画
示例。它保留当前按下的键的
贴图
,然后基于
贴图中的所有键移动对象


这种方法使用
键绑定
,由于博客中给出的原因,这比KeyListener更受欢迎。

我很困惑,所以基本上,当按下一个键时,检查它是什么键并将其添加到列表中,释放时,将其从列表中删除,然后使用完成的更新循环检查列表中的内容并更新b的状态all@MadProgrammer基本上是的。当按键被按下时,将其添加到列表中,然后根据是否按下一个或多个按键,更新球的位置。然后当按键被释放时,将其从列表中删除。很好,因此从按键事件处理程序方法中删除移动逻辑。您应该得到两个按键事件;每个按键一个。您的逻辑是否rk,如果他们一个接一个地来?@SteveHarrington问题是,我只得到一个
public synchronized void formKeyPressed(java.awt.event.KeyEvent evt) {                                
        pressed.add(evt.getKeyCode());
        System.out.println("Added:"+evt.getKeyCode());

        if(pressed.size() == 1) {
            System.out.println("Size is 1");
            if(evt.getKeyCode() == evt.VK_UP) {
                if(y <= 25) {
                    y = 25;
                }
                else  {
                    y = y - yUpSpeed;
                }
            }
            if(evt.getKeyCode() == evt.VK_DOWN) {
                if(y >= (500-25)) {
                    y = (500-25);
                }
                else {
                    y = y + yDownSpeed;
                }
            }
            if(evt.getKeyCode() == evt.VK_LEFT) {
                if(x <= 0) {
                    x = 0;
                }
                else {
                    x = x - xLeftSpeed;
                }
            }
            if(evt.getKeyCode() == evt.VK_RIGHT) {
                if(x >= (500-25)) {
                    x = (500-25);
                }
                else {
                    x = x + xRightSpeed;
                }
            }
        }

        else if(pressed.size() == 2) {
            System.out.println("Size is 2");
            if(pressed.containsAll(upLeft)) {
                if(y <= 25) {
                    y = 25;
                }
                else  {
                    y = y - yUpSpeed;
                }
                if(x <= 0) {
                    x = 0;
                }
                else {
                    x = x - xLeftSpeed;
                }
            }
            if(pressed.containsAll(upRight)) {
                if(y <= 25) {
                    y = 25;
                }
                else  {
                    y = y - yUpSpeed;
                }
                if(x >= (500-25)) {
                    x = (500-25);
                }
                else {
                    x = x + xRightSpeed;
                }
            }
            if(pressed.containsAll(downLeft)) {
                if(y >= (500-25)) {
                    y = (500-25);
                }
                else {
                    y = y + yDownSpeed;
                }
                if(x <= 0) {
                    x = 0;
                }
                else {
                    x = x - xLeftSpeed;
                }
            }
            if(pressed.containsAll(downRight)) {
                if(y >= (500-25)) {
                    y = (500-25);
                }
                else {
                    y = y + yDownSpeed;
                }
                if(x >= (500-25)) {
                    x = (500-25);
                }
                else {
                    x = x + xRightSpeed;
                }
            }
        }
        else {
            System.out.println("Size is more than 2");
        }

    public synchronized void formKeyReleased(java.awt.event.KeyEvent evt) { 
            System.out.println("Removed:"+evt.getKeyCode());
            pressed.remove(evt.getKeyCode());
        }