我真的很绝望。我已经尝试了所有可以找到的技巧,在互联网上搜索了几天,我仍然无法理解为什么我的代码无法工作。它只是不响应我的键盘输入,没有错误信息。
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) {}
}
答案 0 :(得分:4)
我已经尝试了所有可以找到的技巧,在互联网上搜索了几天
那你为什么还在尝试使用KeyListener?您在论坛上找到的更好的解决方案将始终告诉您使用密钥绑定。
有关使用KeyListner和解决方案的常见问题以及使用Key Bindings的常见问题,请参阅Motion With the Keyboard,这是您应该使用的。
答案 1 :(得分: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类添加为键侦听器。
编辑:在主方法
中创建类的实例new SnakeJPanel();
然后创建一个构造函数,
private SnakeJPanel() {
addKeyListener(this);
}