2015-04-03 81 views
0

请 - 我需要我正在处理的这段代码的帮助 - 我知道它很小,但我找不到它有什么问题。我想要移动红色的矩形左右,为此我创建了一个单独的方法,然后在keyPressed方法中调用它,但它不起作用。Java图形按键移动

import java.awt.Color; 

import java.awt.Dialog; 

import java.awt.Graphics; 

import java.awt.event.ActionEvent; 

import java.awt.event.ActionListener; 

import java.awt.event.KeyEvent; 

import java.awt.event.KeyListener; 

import javax.swing.JPanel; 

import javax.swing.Timer; 


public class PanelGraph extends JPanel implements KeyListener,ActionListener { 

int BARX=100,BARY=230,Width=60,Hight=10; 

int BARVELX=0,BARVELY=0; 

int BX=100,BY=100,BWidth=20,BHight=20; 

int VELX=2,VELY=2; 

public Timer t= new Timer(20,this); 

    //@Override 
    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(BARX, BARY, Width, Hight); 
     g.setColor(Color.black); 
     g.fillOval(BX, BY, BWidth, BHight); 
     t.start(); 

    } 




public void balMovement() { 

    BX+=VELX; 
    BY+=VELY; 
    //Checking for X border collution 
    if(BX<0||BX>260){ 
     VELX=-VELX; 
    } 

    //Checking for Y border collution 
    if(BY<0||BY>240){ 
     VELY=-VELY; 

    } 


    repaint(); 
} 

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

     if(e.getKeyCode()==KeyEvent.VK_DOWN){ 
      downKey(); 
     } 
     repaint(); 
    } 
    @Override 
    public void keyReleased(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void keyTyped(KeyEvent arg0) { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     balMovement(); 

    } 
    //Moving right methods 
    public void rightKey(){ 
     BARX+=BARVELX; 
     BARY=0; 
    } 
    //Moving left method 
    public void downKey(){ 
     BARX-=BARVELX; 
     BARY=0; 
    } 

} 

主要

import javax.swing.JFrame; 



public class MiniTeniis { 

public JFrame frame; 

public MiniTeniis(){ 

    PanelGraph panelG= new PanelGraph(); 
    frame= new JFrame("Mini Tennis"); 
    frame.setSize(300,300); 
    frame.setVisible(true); 
    frame.add(panelG); 
    frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE); 

} 

    public static void main(String[] args) { 
     MiniTeniis M= new MiniTeniis(); 
     PanelGraph P = new PanelGraph(); 
     P.setFocusable(true); 
     P.setFocusTraversalKeysEnabled(false); 
    } 

} 
+0

见[运动使用键盘(https://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/),用于与钥匙的示例绑定。另外,变量名不应以大写字母开头,单个字母变量名称可怕。变量名应该是描述性的!最后你的代码创建两个PanelGraph对象。第二个是从来没有用过,所以摆脱它。 – camickr 2015-04-03 22:43:33

+0

你是指主要方法中的一个? – user3500147 2015-04-03 22:57:06

回答

2

两个主要问题。

  1. 你从来没有真正注册PanelGraph关键事件
  2. 的收件人您PanelGraph不可作为焦点,这意味着它(最有可能)永远没有资格接收键盘焦点,从来没有触发关键事件。

解决方案?不要使用KeyListener,严重的是,使用Key Bindings API来解决这个API有很多问题。

更多细节参见

How to Use Key Bindings
+0

我确实将它设置为主要方法 – user3500147 2015-04-03 22:44:12

+1

中的焦点并且'main'中的'P'与构造函数中的'panelG'有什么关系? – MadProgrammer 2015-04-03 22:45:07

+0

它的PanelGraph类的对象 – user3500147 2015-04-03 22:47:14