2015-07-12 5 views
0

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

package com.Game.game; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JFrame 
{ 

final static int width = 500; 
final static int height = 500; 

public int x = 250; 
public int y = 250; 
public int changeX = 10; 
public int changeY = 10; 

public static void main(String[] args) 
{ 
    new Game(); 
} 

public Game() 
{ 
    KeyListener listener = new KeyListening(); 
    addKeyListener(listener); 
    setFocusable(true); 
    DrawingStuff drawingstuff = new DrawingStuff(); 
    add(drawingstuff); 
    setSize(width, height); 
    setLocationRelativeTo(null); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setVisible(true); 
} 

public class DrawingStuff extends JPanel 
{ 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g.drawString("Hey there!", 300, 300); 
     g.setColor(Color.RED); 
     g.fillRect(x, y, 50, 50); 
    } 
} 

public class KeyListening implements KeyListener 
{ 
    DrawingStuff drawingstuff = new DrawingStuff(); 
    @Override 
    public void keyPressed(KeyEvent e) 
    { 
     if(e.getKeyCode() == KeyEvent.VK_UP) 
     { 
      y = y + changeY; 
      System.out.println("Hey"); 
      drawingstuff.repaint(); 
     } 

    } 
    @Override 
    public void keyReleased(KeyEvent e) 
    { 


    } 
    @Override 
    public void keyTyped(KeyEvent e) 
    { 


    } 
} 


public void update() 
{ 

} 
} 

EDIT: Fixed его. Я забрал ключ слушателя вещи в конструкторе, добавил команду, чтобы сосредоточиться на «drawingstuff» в конструкторе, и, самое главное, добавили немного кода в конце метода конструктора:

while(true) 
    { 
     drawingstuff.repaint(); 
    } 
+3

Даже если это работает, IMHO, делая '#repaint()' в цикле while, является неправильным. – PeterMmm

ответ

0

Проблема в том, что ваш объект KeyListening имеет ссылку на другой объект DrawingStuff, чем тот, который вы добавили в свой пользовательский интерфейс внутри конструктора Game.

public class KeyListening implements KeyListener 
{ 
    DrawingStuff drawingstuff = new DrawingStuff(); 
    ... 

Вы должны пройти DrawingStuff ссылку на экземпляр KeyListening так, что он может сказать правильный объект перерисовать себя.

Смежные вопросы