2016-08-24 65 views
0

我已添加keylistener尝试并获得形状向右移动,当我按下右箭头键时。但它不起作用。我真的不知道如何使用keylistner。有人能帮我吗。试图使用按键监听器,但形状不会移动

这是代码:

package walkingman; 
import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Color; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class WalkingMan extends JPanel implements KeyListener{ 
    int x = 0; 
    int y = 0; 

    @Override 
    public void paint(Graphics g){ 
     super.paint(g); 
     g.fillOval(x, y, 150, 150); 
    } 

    public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame ("Walking Man"); 
     frame.setSize(1080,720); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     WalkingMan game = new WalkingMan(); 
     frame.add(game); 

     while (true){ 
      game.repaint(); 
      game.keyPressed(e); 
     } 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT){ 
      x++; 
     } 
     repaint(); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 
} 
+0

一个更明确的方式,为什么你叫'game.keyPressed(E );'这里?当你按下键时它会被触发。 –

+0

我已经删除了它,但它仍然不起作用@BahramdunAdil – Cutter

回答

1

有你的代码

  1. 的几个问题你永远不添加KeyListener到面板上。
  2. A KeyListener对于JPanel只有在它是可重点的&也将集中。
  3. 覆盖paintComponent而不是paint
  4. 在方法结束时调用setVisible
  5. 摆脱整个while循环,它只会导致问题。使用KeyBindings代替KeyListener s。

固定码无键绑定:

import java.awt.Graphics; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import java.awt.Color; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

public class WalkingMan extends JPanel implements KeyListener { 
    int x = 0; 
    int y = 0; 

    @Override 
    public void paintComponent(Graphics g) { // Overide paintComponent, not paint 
     super.paintComponent(g); 
     g.fillOval(x, y, 150, 150); 
    } 

    public WalkingMan() { // Class Constructor 
     setFocusable(true); // KeyListeners only work if the component is focusable 
     addKeyListener(this); // Add the KeyListener implemented by this class to the instance 
    } 

    public void createAndShowGUI() { 
     JFrame frame = new JFrame("Walking Man"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     WalkingMan game = new WalkingMan(); 
     frame.add(game); 

     frame.setSize(1080, 720); 
     frame.setVisible(true); // Call setVisible after adding the components 

     game.requestFocusInWindow(); // Request focus for the panel 
    } 

    public static void main(String[] args) throws InterruptedException { 
     new WalkingMan().createAndShowGUI(); 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     if (e.getKeyCode() == KeyEvent.VK_RIGHT) { 
      x++; 
     } 
     repaint(); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

    } 

    @Override 
    public void keyTyped(KeyEvent e) { 

    } 

} 
+0

非常感谢。如果你能解释你对我做了什么,这将是非常有用的。谢谢。 – Cutter

+0

@Cutter你知道哪些部分?我已经用评论更新了我的代码,我希望他们能提供帮助。 –

+0

非常感谢。真的有帮助。 – Cutter

0

设置框显示和删除while循环,其仍然在运行之前好了。

public static void main(String[] args) throws InterruptedException { 
     JFrame frame = new JFrame ("Walking Man"); 
     frame.setSize(1080,720); 

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     WalkingMan game = new WalkingMan(); 
     frame.add(game); 

     frame.setVisible(true);//Call visible method here 

    } 
+0

这没有奏效 – Cutter

+0

您好像没有为您的类定义任何构造函数。如何定义一个并调用JFrame并使其可见 –

+0

我该如何做到这一点? – Cutter

0

为什么不调整你的代码在这样

import javax.swing.*; 
import java.awt.*; 
import javax.swing.border.LineBorder; 
import java.awt.Color; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

public class WalkingMan extends JFrame{ 
    EmilsKeyClass keyBoard = new EmilsKeyClass(); 

    public WalkingMan(){ 
     add(keyBoard,BorderLayout.CENTER); 

     keyBoard.addKeyListener(new KeyAdapter(){ 
       @Override 
       public void keyPressed(KeyEvent e){ 

        if(e.getKeyCode()== KeyEvent.VK_ENTER){ 
         x++; 
         repaint(); 
        } 
       } 
      }); 
     keyBoard.setFocusable(true); 
    } 
    public static void main(String [] args){ 
     WalkingMan frame = new WalkingMan(); 

     frame.setTitle("Walking Man"); 
     frame.setSize(1080,720); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
    public class EmilsKeyClass extends JPanel{ 
     int x = 0; 
     int y = 0; 

     public EmilsKeyClass(){    
     } 

     @Override 
     public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      super.paint(g); 
      g.fillOval(x, y, 150, 150); 
      //your code 
     } 
    } 

}