2013-10-20 46 views
0

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

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) {} 

}

回答

1

你添加的keyPressed方法里面的KeyListener。但是,keyPressed方法在添加keyListener之前不会被调用。只需将其添加到主方法中或创建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); 
} 
+0

addKeyListener(this);无法添加到CreateAndShowGUI,它不能用于静态类... – Atlantis

+0

创建类的实例,并在构造函数中添加键监听器。编辑我的答案,检查它的底部。 – Troubleshoot

+0

仍然不能工作:( – Atlantis

4

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

那你为什么还在试图使用KeyListener?您在论坛上找到的更好的解决方案将始终告诉您使用密钥绑定。

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