0

我真的很绝望。我已经尝试了所有我能找到的技巧,在互联网上搜索了几天,但我仍然不明白为什么我的代码不能工作。它只是不响应我的键盘输入,没有错误消息。

package drawLine;

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

import javax.swing.*;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class SnakeJPanel extends JPanel implements KeyListener {
    private static final long serialVersionUID = 7526472295622776147L;


JPanel panelForSnake, snake;

final int WID = 10;
final int HEI = 10;
public static int x1 = 50;
public static int y1 = 50;
public static boolean right = true, left = false, down = false, up = false;
static long millis =System.currentTimeMillis();
static long millisn =System.currentTimeMillis();


public class MyGraphics extends JComponent {

    private static final long serialVersionUID = 1L;

    MyGraphics() {
        setPreferredSize(new Dimension(1000,700));
    }


    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.setColor(Color.red);
        g.fillOval(x1, y1, WID, HEI);
    }
}

public JPanel createContentPane (){
    JPanel totalGUI = new JPanel();
    totalGUI.setLayout(null);


    panelForSnake = new JPanel();
    panelForSnake.setBackground(Color.black);
    panelForSnake.setLocation(1,1);
    panelForSnake.setSize(1000,700);
    totalGUI.add(panelForSnake);

    MyGraphics tr = new MyGraphics();
    tr.setLocation(1,50);
    tr.setSize(1000,1000);
    panelForSnake.add(tr);

    return totalGUI;

}
private static void createAndShowGUI() {

    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("Snake Harel");
    //Create and set up the content pane.
    SnakeJPanel demo = new SnakeJPanel();
    frame.setContentPane(demo.createContentPane());

    // The other bits and pieces that make our program a bit more stable.

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1000, 1000);
    frame.setVisible(true);


}
public void keyPressed(KeyEvent e) {
    requestFocusInWindow();
    requestFocus();
    addKeyListener((KeyListener) this);
    setFocusable(true);
    setFocusTraversalKeysEnabled(false);
    int key = e.getKeyCode();

    if ((key == KeyEvent.VK_LEFT) && (!right)) {
        left = true;
        up = false;
        down = false;
    }

    if ((key == KeyEvent.VK_RIGHT) && (!left)) {
        right = true;
        up = false;
        down = false;
    }

    if ((key == KeyEvent.VK_UP) && (!down)) {
        up = true;
        right = false;
        left = false;
    }

    if ((key == KeyEvent.VK_DOWN) && (!up)) {
        down = true;
        right = false;
        left = false;
    }
}
public static void move(boolean l,boolean r,boolean u,boolean d){
    if (r = true){
        millis =System.currentTimeMillis();
        millisn =System.currentTimeMillis();
            while (millisn<millis+20){
                millisn=System.currentTimeMillis();
            }
        ++x1;
    }
    if (l = true){
        millis =System.currentTimeMillis();
        millisn =System.currentTimeMillis();
            while (millisn<millis+20){
                millisn=System.currentTimeMillis();
            }
        --x1;
    }
    if (u = true){
        millis =System.currentTimeMillis();
        millisn =System.currentTimeMillis();
            while (millisn<millis+20){
                millisn=System.currentTimeMillis();
            }
        ++y1;
    }
    if (d = true){
        millis =System.currentTimeMillis();
        millisn =System.currentTimeMillis();
            while (millisn<millis+20){
                millisn=System.currentTimeMillis();
            }
        --y1;
    }
}

public static void main(String[] args) {
    //Schedule a job for the event-dispatching thread:
    //creating and showing this application's GUI.
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
         move(left, right, up, down);
         }
    });
}

public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}

}

4

2 回答 2

4

我已经尝试了所有我能找到的技巧,在互联网上搜索了几天

那你为什么还要尝试使用 KeyListener ???您在论坛上找到的更好的解决方案总是会告诉您使用键绑定。

有关使用 KeyListner 的常见问题和解决方案以及使用 Key Bindings 的工作示例,请参阅Motion With the Keyboard ,这是您无论如何都应该使用的。

于 2013-10-20T18:01:27.030 回答
1

您正在 keyPressed 方法中添加 keyListener 。但是,在添加 keyListener 之前永远不会调用 keyPressed 方法。只需在 main 方法或创建 GUI 时添加它。

private static void createAndShowGUI() {
    JFrame.setDefaultLookAndFeelDecorated(true);
    JFrame frame = new JFrame("Snake Harel");
    //Create and set up the content pane.
    SnakeJPanel demo = new SnakeJPanel();
    frame.setContentPane(demo.createContentPane());
    addKeyListener(this);

    // The other bits and pieces that make our program a bit more stable.

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(1000, 1000);
    frame.setVisible(true);
}

由于您没有使用所有 keyListener 接口,我建议改为创建一个嵌套类并扩展 KeyAdapter 类。

public class ActionListener extends KeyAdapter {
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if ((key == KeyEvent.VK_LEFT) && (!right)) {
                left = true;
                up = false;
                down = false;
        }
        if ((key == KeyEvent.VK_RIGHT) && (!left)) {
            right = true;
            up = false;
            down = false;
        }
        if ((key == KeyEvent.VK_UP) && (!down)) {
            up = true;
            right = false;
            left = false;
        }
        if ((key == KeyEvent.VK_DOWN) && (!up)) {
            down = true;
            right = false;
            left = false;
        }
}

然后,您将添加 ActionListener 类作为关键侦听器。

编辑:在 main 方法中创建类的实例,

new SnakeJPanel();

然后创建一个构造函数,

private SnakeJPanel() {
    addKeyListener(this);
}
于 2013-10-20T16:47:09.307 回答