Проблема с несколькими прыгающими точками - PullRequest
0 голосов
/ 13 мая 2018

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

enter image description here

Это мои коды для DotsPanel:

public DotsPanel(){

    frameSize = 300;
    setBounds (100, 100,frameSize,frameSize );
    setPreferredSize (new Dimension(frameSize, frameSize));
    setVisible(true);

    x = 0;
    y = 40;
    moveX = moveY = 3;


    for (int i = 0; i < dot.length; i++)
    {
        dot[i] = new Dot (frameSize, frameSize);
    }

    timer = new Timer(DELAY, new TimerListener());  
    timer.start();      
}

private class TimerListener implements ActionListener {

    public void actionPerformed(ActionEvent arg0) {
        for (int i = 0; i < dot.length; i++)
        {
            dot[i].animate();       
        }
        repaint();      
    }
}

public void paintComponent(Graphics g){

    for (int i = 0; i < dot.length; i++)
    {
        dot[i].draw(g);             
    }
}

public void run ()
{   
    while(true)
    {
        for (int i = 0; i < dot.length; i++)
        {
            dot[i].animate();       
        }   
        repaint();  
    }
}

Это класс Dot:

public Dot(int width, int height) {
    this.width = width;
    this.height = height;
    x = r.nextInt(width - d);
    y = r.nextInt(height - d);
    speed = r.nextInt(10);
    red = r.nextInt(256);
    green = r.nextInt(256);
    blue = r.nextInt(256);
    moveX = moveY = 3;
}

public void animate ()
{           
    x += moveX;
    y += moveY;
    if (x <= 0 || x >= 300)
            moveX = moveX * -1;
    if (y <= 0 || y >= 300)
        moveY = moveY * -1;
}

public void draw(Graphics g) {
    g.setColor(new Color(red, green, blue));
    //g.setColor(Color.BLUE);
    g.fillOval(x, y, d, d);

}

Я не знаю, какая часть пошла не так. Я предполагаю, что это метод ничьей. Я попытался использовать краску вместо paintComponent, но результат все тот же. И если я удаляю цикл while, точки не анимируются, я сделал это в соответствии с учебником, который я видел в youtube, хотя учебник работает хорошо.

1 Ответ

0 голосов
/ 13 мая 2018

Ну, я думаю, это просто потому, что вы не «очищаете» предыдущий рисунок каждый раз, когда рисуете новый. В результате вы видите, что все ваши предыдущие графики непрерывно складываются!

РЕДАКТИРОВАТЬ (правильное решение camickr в комментариях ниже):

Решение состоит в том, чтобы вызвать super.paintComponent(g) в верхней части метода для вызова функции рисования по умолчанию, которая для JPanel закрасит фон для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...