Java 如何处理多个按键?

Java 如何处理多个按键?,java,keypress,Java,Keypress,在KeyPressed方法中,一次不能处理多个键。我搜索了这个,但不明白如何处理我编写代码的方式。如果您能告诉我如何使用我的代码,我将不胜感激 private boolean play = false; private int player1Score = 0; private int player2Score = 0; private int player1Y = 215; private int player2Y = 215; private Timer timer; private

在KeyPressed方法中,一次不能处理多个键。我搜索了这个,但不明白如何处理我编写代码的方式。如果您能告诉我如何使用我的代码,我将不胜感激

private boolean play = false;

private int player1Score = 0;
private int player2Score = 0;

private int player1Y = 215;
private int player2Y = 215;

private Timer timer;
private int delay = 8;

private int ballposX = 120;
private int ballposY = 350;
private int ballXdir = -2;
private int ballYdir = -3;

public GamePlay(){
    addKeyListener(this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    timer = new Timer(delay, this);
    timer.start();
}

public void paint(Graphics g){

    g.setColor(Color.black);
    g.fillRect(1, 1, 692, 592);

    g.setColor(Color.yellow);
    g.fillRect(0, 0, 3, 492);
    g.fillRect(0, 0, 692, 3);
    g.fillRect(691, 0, 3, 492);
    g.fillRect(0, 468, 692, 3);

    g.setColor(Color.white);
    g.fillRect(15, player1Y, 10, 75);
    g.fillRect(670, player2Y, 10, 75);

    g.fillOval(ballposX, ballposY, 20, 20);

    g.setColor(Color.white);
    g.setFont(new Font("serif", Font.BOLD, 25));
    g.drawString("" + player1Score, 175, 30);

    g.setFont(new Font("serif", Font.BOLD, 25));
    g.drawString("" + player2Score, 525, 30);

    if(player1Score >= 11){
        play = false;
        ballXdir = 0;
        ballYdir = 0;
        g.setColor(Color.red);
        g.setFont(new Font("serif", Font.BOLD, 30));
        g.drawString("Player 1 Won", 260, 200);

        g.setFont(new Font("serif", Font.BOLD, 20));
        g.drawString("Press Enter to restart ", 250, 250);
    }
    if(player2Score >= 11){
        play = false;
        ballXdir = 0;
        ballYdir = 0;
        g.setColor(Color.red);
        g.setFont(new Font("serif", Font.BOLD, 30));
        g.drawString("Player 2 Won", 260, 200);

        g.setFont(new Font("serif", Font.BOLD, 20));
        g.drawString("Press Enter to restart ", 250, 250);
    }

    g.dispose();
}
@Override
public void actionPerformed(ActionEvent arg0) {
    timer.start();
    if(play){
        if(new Rectangle(ballposX, ballposY, 20, 20).intersects(new Rectangle(15, player1Y, 10, 75))){
            ballXdir = -ballXdir;
        }
        if(new Rectangle(ballposX, ballposY, 20, 20).intersects(new Rectangle(670, player2Y, 10, 75))){
            ballXdir = -ballXdir;
        }
        ballposX += ballXdir;
        ballposY += ballYdir;
        if(ballposX < 0){
            ballXdir = -ballXdir;
            player2Score += 1;
        }
        if(ballposY < 0){
            ballYdir = -ballYdir;
        }
        if(ballposX > 670){
            ballXdir = -ballXdir;
            player1Score += 1;
        }
        if(ballposY > 460){
            ballYdir = -ballYdir;
        }
    }

    repaint();

}

@Override
public void keyPressed(KeyEvent e) {

    if(e.getKeyCode() == KeyEvent.VK_S){
        if(player1Y >= 390){
            player1Y = 390;
        }
        else{
            moveUp2();

        }
    }
    if(e.getKeyCode() == KeyEvent.VK_W){
        if(player1Y <= 10){
            player1Y = 10;
        }
        else{
            moveDown2();
        }
    }
    if(e.getKeyCode() == KeyEvent.VK_DOWN){
        if(player2Y >= 390){
            player2Y = 390;
        }
        else{
            moveUp();

        }
    }
    if(e.getKeyCode() == KeyEvent.VK_UP){
        if(player2Y <= 10){
            player2Y = 10;
        }
        else{
            moveDown();
        }
    }
    if(e.getKeyCode() == KeyEvent.VK_ENTER){
        if(!play){
            play = true;
            ballposX = 120;
            ballposY = 350;
            ballXdir = -2;
            ballYdir = -3;
            player1Y = 215;
            player2Y = 215;
            player1Score = 0;
            player2Score = 0;

            repaint();

        }
    }

}

private void moveDown() {
    play = true;
    player2Y -= 20;
    repaint();
}
private void moveUp() {
    play = true;
    player2Y += 20;
    repaint();
}

private void moveDown2() {
    play = true;
    player1Y -= 20;
    repaint();
}
private void moveUp2() {
    play = true;
    player1Y += 20;
    repaint();
}
@Override
public void keyReleased(KeyEvent arg0) {
    // TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent arg0) {
    // TODO Auto-generated method stub

}
private boolean play=false;
私有int player1Score=0;
私有int player2Score=0;
私人整数播放器1y=215;
私人整数播放器2y=215;
私人定时器;
专用int延迟=8;
私有int-ballposX=120;
私人整数ballposY=350;
私有int-ballXdir=-2;
私有int-ballYdir=-3;
公共游戏{
addKeyListener(此);
设置聚焦(真);
setFocusTraversalKeysEnabled(false);
定时器=新定时器(延迟,此);
timer.start();
}
公共空间涂料(图g){
g、 设置颜色(颜色为黑色);
g、 fillRect(1,1692,592);
g、 setColor(颜色为黄色);
g、 fillRect(0,0,3492);
g、 fillRect(0,0692,3);
g、 fillRect(691,0,3492);
g、 fillRect(0468692,3);
g、 setColor(Color.white);
g、 fillRect(15,player1Y,10,75);
g、 fillRect(670,player2Y,10,75);
g、 fillOval(ballposX,ballposY,20,20);
g、 setColor(Color.white);
g、 setFont(新字体(“衬线”,Font.BOLD,25));
g、 抽绳(“+player1Score,175,30);
g、 setFont(新字体(“衬线”,Font.BOLD,25));
g、 抽绳(“+player2Score,525,30);
如果(player1Score>=11){
玩=假;
ballXdir=0;
ballYdir=0;
g、 setColor(Color.red);
g、 setFont(新字体(“衬线”,Font.BOLD,30));
g、 抽绳(“玩家1赢了”,260,200);
g、 setFont(新字体(“衬线”,Font.BOLD,20));
g、 抽绳(“按回车键重新启动”,250、250);
}
如果(player2Score>=11){
玩=假;
ballXdir=0;
ballYdir=0;
g、 setColor(Color.red);
g、 setFont(新字体(“衬线”,Font.BOLD,30));
g、 抽绳(“玩家2赢了”,260,200);
g、 setFont(新字体(“衬线”,Font.BOLD,20));
g、 抽绳(“按回车键重新启动”,250、250);
}
g、 处置();
}
@凌驾
已执行的公共无效操作(操作事件arg0){
timer.start();
如果(玩){
if(新矩形(ballposX,ballposY,20,20)。相交(新矩形(15,player1Y,10,75))){
ballXdir=-ballXdir;
}
if(新矩形(ballposX,ballposY,20,20)。相交(新矩形(670,player2Y,10,75))){
ballXdir=-ballXdir;
}
ballposX+=ballXdir;
ballposY+=ballYdir;
if(ballposX<0){
ballXdir=-ballXdir;
player2Score+=1;
}
if(ballposY<0){
ballYdir=-ballYdir;
}
如果(ballposX>670){
ballXdir=-ballXdir;
player1Score+=1;
}
如果(ballposY>460){
ballYdir=-ballYdir;
}
}
重新油漆();
}
@凌驾
按下公共无效键(按键事件e){
如果(例如getKeyCode()==KeyEvent.VK_S){
如果(player1Y>=390){
player1Y=390;
}
否则{
moveUp2();
}
}
if(e.getKeyCode()==KeyEvent.VK_W){
如果(player1Y=390){
player2Y=390;
}
否则{
moveUp();
}
}
如果(例如getKeyCode()==KeyEvent.VK_UP){

如果(player2Y您可以跟踪按下的键。每当释放一个键时,您都会将其从按下的键列表中删除。如果按下一个键时按下的键列表不是空的,则会按下多个键。

您能用我的代码给我举个例子吗。我不明白列表是什么(数组列表?)以及如何删除。键绑定有效吗?包含您需要的解决方案。请添加关于您实际尝试完成的内容的说明。多次按键应该做什么?您能给出具体的用例吗?根据这些细节,您可以得到完全不同的答案。