Java箭头键键侦听器逻辑

Java箭头键键侦听器逻辑,java,logic,keylistener,Java,Logic,Keylistener,因此,我正在尝试为箭头键创建一个键侦听器,它可以响应箭头键,并且可以同时处理多个键。我试图将按下的键放入ArrayList,然后在我的repaint()方法中处理它们。然而,我有一个问题。我不确定在哪里添加密钥,在哪里删除它们。与其说我在寻找代码解决方案,不如说我在寻找它背后的逻辑 //graham import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.ev

因此,我正在尝试为箭头键创建一个键侦听器,它可以响应箭头键,并且可以同时处理多个键。我试图将按下的键放入ArrayList,然后在我的repaint()方法中处理它们。然而,我有一个问题。我不确定在哪里添加密钥,在哪里删除它们。与其说我在寻找代码解决方案,不如说我在寻找它背后的逻辑

    //graham

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener; 
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;

class Arrows extends JPanel implements KeyListener {
private int c = 0;
private int x = 250;
private int y = 250;
private static ArrayList<Integer> keys = new ArrayList<Integer>(); 


public Arrows() {
    this.setPreferredSize(new Dimension(500, 500));
    addKeyListener(this);
}

public void addNotify() {
    super.addNotify();
    requestFocus();
}

public void paintComponent(Graphics g) {

    //*********
    //need to update to make so can press (and hold) multiple different keys at once
    //*********

    g.setColor(Color.WHITE);
    g.fillRect(x, y , 20, 20);
    for(int i = 0; i < keys.size(); i++){ //********> only want to handle one at a time
        //handle each key
        c = keys.get(i);
        switch(c){
        case 37: 
            //left arrow 
            x -= 10;
            keys.remove(i);
            break;
        case 38:
            // up arrow
            y -= 10;
            keys.remove(i);
            break;
        case 39:
            //right arrow
            x += 10;
            keys.remove(i);
            break;
        case 40:
            //down arrow
            y += 10;
            keys.remove(i);
            break;
        }
    }
    g.setColor(Color.BLUE);
    g.fillRect(x, y, 20, 20);
}



public void keyPressed(KeyEvent e) { 
    //******
    //need to create a list of keys pressed, then process them in the repaint. Later delete them after pressed
    //******
    keys.add(e.getKeyCode());
    //repaint();
}
public void keyReleased(KeyEvent e) { 
    //****
    //here need to repaint --- need to correct to do something proper later --- due to holding down a key teleports..
    //****
    repaint();
}
public void keyTyped(KeyEvent e) {
}

public static void main(String[] s) {
    JFrame f = new JFrame();
    f.getContentPane().add(new Arrows());
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.pack();
    f.setVisible(true);

    //need to null out keys
    keys.add(65);
}
}
//格雷厄姆
导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.util.ArrayList;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
类箭头扩展了JPanel实现了KeyListener{
私有int c=0;
私有整数x=250;
私人整数y=250;
私有静态ArrayList键=新ArrayList();
公共箭头(){
此.setPreferredSize(新尺寸(500500));
addKeyListener(此);
}
public void addNotify(){
super.addNotify();
requestFocus();
}
公共组件(图形g){
//*********
//需要更新以使您可以同时按下(并按住)多个不同的键
//*********
g、 setColor(Color.WHITE);
g、 fillRect(x,y,20,20);
对于(int i=0;i一次只处理一个
//处理每把钥匙
c=键。获取(i);
开关(c){
案例37:
//左箭头
x-=10;
钥匙。移除(i);
打破
案例38:
//向上箭头
y-=10;
钥匙。移除(i);
打破
案例39:
//右箭头
x+=10;
钥匙。移除(i);
打破
案例40:
//向下箭头
y+=10;
钥匙。移除(i);
打破
}
}
g、 setColor(Color.BLUE);
g、 fillRect(x,y,20,20);
}
按下公共无效键(键事件e){
//******
//需要创建一个按键列表,然后在重绘中处理它们。稍后在按下后删除它们
//******
添加(例如getKeyCode());
//重新油漆();
}
公开无效密钥已释放(密钥事件e){
//****
//这里需要重新绘制---需要更正以便以后做正确的事情---因为按住了一个键。。
//****
重新油漆();
}
public void keyTyped(KeyEvent e){
}
公共静态void main(字符串[]s){
JFrame f=新的JFrame();
f、 getContentPane().add(新箭头());
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 包装();
f、 setVisible(真);
//需要清空密钥
增加(65);
}
}

看看你是否可以用我的代码作为例子。他们非常相似

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class MyGame extends JPanel implements ActionListener, KeyListener {
    Timer t = new Timer(5, this);
    int x = 0, y = 0, velx =0, vely =0, g = 0;
    private Color color;

    public MyGame() {
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(800, 1000);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(color);
        g.fillRect(x, y, 50, 30);



    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();

        {
            if (code == KeyEvent.VK_DOWN) {
                vely = 1; // removing velx = 0 allows us to go vertically and horizontlly at the same time

            }
            if (code == KeyEvent.VK_UP) {
                vely = -1; // same goes for here

            }
            if (code == KeyEvent.VK_LEFT) {

                velx = -1;
            }

            {
                if (code == KeyEvent.VK_RIGHT) {

                    velx = 1;

                }
            }
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyReleased(KeyEvent e) {
        velx = 0;
        vely = 0;
    }




    public static void main (String arge[]){

        JFrame frame = new JFrame("Testing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        frame.add(new Incoming());           
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }
}

你试过了吗?我不确定如何使用密钥绑定。你能提供一个链接吗?那是评论中的一个链接。谢谢,我会查出来的谢谢你的回复,但是什么是传入(),它在第111行,给了我一个错误?没有它,这个程序似乎无法运行。看起来是这样的:frame.add(newincoming());这是一个示例,我不希望您复制并粘贴代码。这是我的第二节课。据我所知,您在使用关键侦听器方面遇到了问题。这将向您展示如何添加键。如果你仍然不知道如何更详细地解释你的问题,那么我可以更好地帮助你。