2015-06-25 4 views
0

Я пытаюсь нарисовать прямоугольник, который его положение обновляется каждую секунду, потому что у меня есть класс, который расширяет JPanel, и в нем я переопределил функцию paint (или paintComponent). Я попробовал как _ но, очевидно, эта функция вызывается только один раз и, как показано в приведенном ниже коде, когда я пытаюсь вызвать ее в бесконечном цикле с функцией repaint, она не вызвана, никаких идей, что я могу сделать?repaint in java не работает

public class Board extends JPanel implements KeyListener{ 
public void setUpBoard(){ 
    JFrame frame = new JFrame(); 
    Board board = new Board(); 
    frame.setVisible(true); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(600, 600); 
    frame.setLocation(350, 80); 
    frame.add(board); 
    } 
public void paint(Graphics g){ 
    g.setColor(Color.RED); 
    g.fillRect(food.getX(),200,20,20); 
     } 
} 

приведенный выше код графической части, ниже является основной функцией, которая находится в другом классе:

public static void main(String[] args) throws InterruptedException { 
    Board board = new Board(); 
    FoodGenerator food = new FoodGenerator(); 
    board.setUpBoard(); 
    while(true){ 
     board.repaint(); 
     food.adder(); 
     try { 
      sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 


} 

в приведенном выше food.adder кода, где положение прямоугольника обновлено, которое я проверил и не имеет никаких проблем.

+0

Вы меняете что-либо между вызовами, чтобы перекрасить? Я бы проверял, является ли пищевой объект в вашем основном тем же, что и пища в вашем методе рисования. – bakalolo

+1

Не переопределяйте 'paint', используйте' paintComponent'; Не разрушайте цепочку красок, убедитесь, что вы вызываете 'super.paintComponent'; Взгляните на [Живопись в AWT и Swing] (http://www.oracle.com/technetwork/java/painting-140037.html) и [Выполнение пользовательской живописи] (http://docs.oracle.com/javase/tutorial/uiswing/painting /), чтобы лучше понять, как работает живопись. Кроме того, взгляните на [Создание графического интерфейса с JFC/Swing] (http://docs.oracle.com/javase/tutorial/uiswing/), чтобы лучше понять, как работает графический интерфейс Swing. – MadProgrammer

+0

Вы также можете принять посмотрите [Concurrency in Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) и для простоты, [Как использовать таймеры Swing] (http://docs.oracle.com/) javase/tutorial/uiswing/misc/timer.html) – MadProgrammer

ответ

2

Проблема заключается в том, что вы создаете новый объект Board в setUpBoard и добавление что вашему JFrame:

Board board = new Board(); 
// ... 
frame.add(board); 

Так что, когда вы используете repaint(), вы перекрашивать экземпляр Board, что вы созданный в методе main, а не экземпляр, созданный в setUpBoard, который является тем, который вы добавляете в фрейм.

Это можно легко исправить, используя Board board = this; в setUpBoard, или, что еще проще, на мой взгляд, просто используя frame.add(this). Последующие вызовы repaint затем планируют вызов paint для того же самого объекта Board, который вы создали в основном методе.

Кроме того, поскольку вы работаете с Swing, не используйте paint, а вместо этого используйте paintComponent, убедившись, что super.paintComponent(g) - это первое утверждение в теле метода.

+1

IMHO 'Board' не должен создавать фрейм, но он не влияет на ваш ответ – MadProgrammer

0

Другая проблема заключается в том, что вызовы перерисовки выполняются в основном потоке, а не в потоке событий.

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