2015-05-14 4 views
0

У меня есть рамка, которая как прямоугольник в нем. Я хочу знать, как я могу переместить прямоугольник, если я нажал клавиши со стрелками. Я искал и нашел несколько примеров, но ничего не получалось (странно, как это должно быть просто, что нужно сделать)Как переместить прямоугольник со стрелками?

Вот мой Прямоугольник класс:

public class PlayerOne implements KeyListener { 

    int x,y; 
    public PlayerOne(JPanel panel){ 
     this.x = panel.getWidth()/2; 
     this.y = panel.getHeight()/2; 
    } 

    public void paint(Graphics g){ 
     g.setColor(Color.RED); 
     g.fillRect(125, 480, 60, 10); 
    } 

    @Override 
    public void keyPressed(KeyEvent arg0) { 
     // TODO Auto-generated method stub 
     int keyCode = arg0.getKeyCode(); 
     if(keyCode == arg0.VK_KP_RIGHT){ 
      this.x+=5; 
     } 
    } 

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

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

Это главное:

public class PingPong extends JPanel { 

    private static final long serialVersionUID = -4170574729049260633L; 

    //Initialize 
    Table table = new Table(); 
    PlayerOne po = new PlayerOne(this); 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     table.paint(g); 
     po.repaint(g); 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame();    
     frame.setTitle("Pong"); 
     frame.setSize(326, 533); 
     frame.add(new PingPong()).setBackground(Color.DARK_GRAY); 
     frame.getContentPane().setBackground(Color.DARK_GRAY); 
     frame.setVisible(true); 
    }  
} 
+0

Вам нужен «KeyListener». –

+0

@CoolGuy Я добавил один, все еще, я понятия не имею, как я могу сделать прямоугольник двигаться ... Я отредактировал свой пост, можете ли вы взглянуть, пожалуйста? –

+0

с помощью KeyBindigs вместо KeyListener, краска должна быть paintComponent (с супер. PaintComponent), а не членом KeyListener или каким-либо другим, но реальным JComponent, например. JPanel, рисование должно быть инициализировано repaint() из действия не от самого себя (может вызвать бесконечный цикл) из paintComponent – mKorbel

ответ

2

Там куча проблем здесь:

проблема заключается в том, что ваш прямоугольник рисунок жёстко, о чем свидетельствует здесь:

public void paint(Graphics g){ 
    g.setColor(Color.RED); 
    g.fillRect(125, 480, 60, 10); 
} 

Вы должны использовать x переменную вместо 125

Для того чтобы принять события нажатия клавиш, ваш JPanel необходимо принять фокус, который может быть достигнут с помощью следующих строк:

setFocusable(true); 
requestFocusInWindow(); 

Теперь вы получите события клавиатуры и измените значение x. К сожалению, это не вызовет перерисовку, поэтому ваша коробка все равно не сдвинется.

Вы должны разбить свои классы немного больше, так как распределение обязанностей немного странно. Когда происходит ключевое событие, вам необходимо сообщить свой JPanel repaint(), чтобы обновления отражались на экране.

+0

Я изменил его, он по-прежнему не сдвинется. Как я могу перекрасить PlayerOne после увеличения x? –

+0

[например] (http://stackoverflow.com/a/7940227/714968) на вопрос (SwingTimer) о пошаговой картине для @CoolGuy тоже – mKorbel