2015-10-04 2 views
0

Я попытался нарисовать некоторые фигуры, как вы можете видеть ниже (я не включил другой класс, который включает основной метод) ... проблема в том, что он не перерисовывается, я просто получаю три толстые строки в качестве вывода, но он должен рисовать овал и два прямоугольника, так что они двигаются в кадре, как работает цикл в то время как ...Как перерисовать фигуры в java?

package shapes; 

import java.awt.Color; 
import java.awt.Graphics; 

import javax.swing.JPanel; 

public class GamePanel extends JPanel { 

    int n1=0; 
    int n2=0; 
    int n3=0; 

    @Override 
    public void paintComponent(Graphics g) { 
     do { 
     // super.paintComponent(g); 
     g.drawRect(n1++, 33, 54, 84); 
     g.setColor(Color.BLUE); 
     g.fillRect(100, n2++, 56, 97); 
//  g.setColor(Color.BLUE); 
     g.drawOval(44, n3++, 44, 66); 


     } while (n1<=500 && n2<=500 && n3<=500); 
     n1++; 
     n2++; 
     n3++; 
     repaint(); 
     } 
    } 

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

+0

Просьба уточнить вашу конкретную проблему или добавить дополнительные детали, чтобы выделить именно то, что вам нужно. Как это написано в настоящее время, трудно точно сказать, что вы просите. См. Страницу «Как спросить», чтобы помочь прояснить этот вопрос. –

+2

Никогда не вызывайте repaint() в методе рисования - это вызовет бесконечный цикл. 'поэтому он не показывает три толстые строки' - хорошо, это то, что вы говорите, что код делать. Сначала вы рисуете прямоугольник, начинающийся с (0, 33), затем (1, 33), затем (2, 33), поэтому, конечно, вы получите большую толстую линию шириной 554 пикселя (500 + 54) и 84 пиксела высотой. Я понятия не имею, почему у вас есть 3 переменные, которые имеют одинаковое значение. Вы пытаетесь сделать какую-то анимацию, где картина меняется 500 раз? – camickr

+0

Примечание: paintComponent должен рисовать текущее состояние объекта. Вы должны обновить состояние в другом месте, обычно в выделенном потоке. Каждый раз, когда вы обновляете состояние, делайте вызов 'repaint()' или 'repaint (50)', где 50 - это переиздание задержки n miliseconds – krzydyn

ответ

1
  1. вызовов super.paintComponent, прежде чем делать какие-либо пользовательские картины (а не в вашем цикле);
  2. Не вызывайте repaint из методов рисования, это может создать бесконечный цикл рецензентов, который может потреблять все ваши циклы процессора;
  3. Используйте свинг Timer вместо того, чтобы генерировать регулярные обновления и анимации
Смежные вопросы