2015-04-03 2 views
0

Пожалуйста, мне нужна помощь с этим кодом, над которым я работаю - я знаю, что это что-то маленькое, но я не могу найти, что с ним не так. Я хочу переместить красный прямоугольник вправо и влево, для которого я создал отдельный метод, а затем вызываю его в методе keyPressed, но он не работает.Движение клавиатуры Java Graphics

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

См [Motion Использование клавиатуры] (https://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/) для примера с ключом Наручники. Кроме того, имена переменных не должны начинаться с символа верхнего регистра, а имена переменных с одной буквой ужасны. Имя переменной должно быть описательным! Наконец, ваш код создает два объекта PanelGraph. Второй никогда не используется, поэтому избавитесь от него. – camickr

+0

Вы ссылаетесь на тот, который находится в основном методе? – user3500147

ответ

2

два основных вопроса.

  1. Вы никогда не зарегистрировать PanelGraph в качестве получателя ключевых событий
  2. Вашего PanelGraph не фокусирование, то есть его (скорее всего) не имеет права на получение фокуса клавиатуры и никогда не вызывают ключевые событий.

Решение? Не используйте KeyListener, серьезно, есть много проблем с этим API, которые решаются с помощью API ключевых привязок.

См How to Use Key Bindings для более подробной информации

+0

Я установил его для фокусировки в основном методе – user3500147

+1

И какое отношение 'P' в' main' связано с 'panelG' в конструкторе? – MadProgrammer

+0

его объект класса PanelGraph – user3500147