Java ArrowKey侦听器

时间:2014-05-16 14:47:28

标签: java events logic keylistener

所以我创建了这个程序,我试图根据箭头键移动蓝色方块。但是,我遇到了一些问题(正如您将在代码中看到的那样)。我已经在网上搜索了一个答案,但没有取得胜利。 这是我的问题:

  • 我希望它移动并保持一个位置,而我的代码只是将它重置回它开始的位置。我愚弄了这个,但无法解决它。
  • 我希望它能够在任何方向上移动对角线,而不是一次只移动一个方向,因此在移动过程中改变方向的能力
  • 我希望能够按住键来移动它,这似乎不是问题
  • 除了上面描述的流体运动之外,我还试图让它不会以看起来像抛物线的方式移动(当按住键时它会增加太多)。

我可能只是遇到了一些逻辑问题,或者有一种更简单的方法可以让Java做到这一点。如果是,请留下明确的解释。 请忽略我在整个地方记下的随机记录。

//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, c1 = 0;
private int x = 250;
private int y = 250;
private int cx = 0; //change in x
private int cy = 0; //change in y
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) {

    //*********
    //here need to repaint according to the key
    //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 the key

      //***Should move this to somewhere else, so repaint after update stuff in keyPressed

    //}
    //x += cx;
    //y += cy;
    g.setColor(Color.BLUE);
    g.fillRect(x + cx, y + cy, 20, 20);
}



public void keyPressed(KeyEvent e) { 
    //******
    //need to add to the keyList here
    //might want to use bitset
    //******
    //keys.add(e.getKeyCode());
    //**********************************
    //c = keys.get(0);
    c = e.getKeyCode();
        switch(c){
        case 37: 
            //left arrow 
            cx -= 3;
            //keys.remove(0);
            break;
        case 38:
            // up arrow
            cy -= 3;
            //keys.remove(0);
            break;
        case 39:
            //right arrow
            cx += 3;
            //keys.remove(0);
            break;
        case 40:
            //down arrow
            cy += 3;
            //keys.remove(0);
            break;
        }
        //**********************************
    repaint();
}
public void keyReleased(KeyEvent e) { 
    //****
    //here need to remove key fromt he list, and may want to fix teleportation..
    //****

    //set the change values to 0
    c1 = e.getKeyCode();
    switch(c1){
    case 37: 
        //left arrow 
        cx = 0;
        break;
    case 38:
        // up arrow
        cy = 0;
        break;
    case 39:
        //right arrow
        cx = 0;
        break;
    case 40:
        //down arrow
        cy = 0;
        break;
    }
    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);

    //here want to update every time through constant time accoridng to the keypressed     and ereleased crap

    //repaint();
}
}

1 个答案:

答案 0 :(得分:-1)

一些通用编程评论:

  1. 不要使用requestFocus()。阅读该方法的API,它将建议使用更好的方法。
  2. 不要使用魔术数字。 37,38,39,40没有任何意义。使用正确的KeyEvent.vK ...变量。
  3. 不要使用KeyListener。 Swing旨在与Key Bindings一起使用。有关更多信息和工作示例,请参阅Motion Using the Keyboard