2015-04-03 86 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