Как создать объект несколько раз для одновременного перемещения по экрану? - PullRequest
1 голос
/ 09 декабря 2011

У меня есть нить, которая опускает круг в направлении у.Теперь я хочу создать несколько кругов на экране одновременно со случайными позициями х.

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Goo 
{
protected GooPanel gooPanel;
private boolean loop = true;
protected int width , height;
private int frameTimeInMillis = 50;
private RenderingHints renderingHints = new RenderingHints(
RenderingHints.KEY_ANTIALIASING , RenderingHints.
VALUE_ANTIALIAS_ON);
@SuppressWarnings("serial")

class GooPanel extends JPanel 
{
    public void paintComponent(Graphics g) 
    {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHints(renderingHints);
        draw(g2d);
    }
}

public Goo() 
{
    this (800, 500);
}

public Goo(int w, int h) 
{
    width = w;
    height = h;
    JFrame frame = new JFrame ();

    frame.setSize(width , height);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gooPanel = new GooPanel ();
    gooPanel.setPreferredSize(new Dimension(w, h));
    frame.getContentPane ().add(gooPanel);
    frame.pack();
    frame.setVisible(true);
}

public void go() 
{
    while (loop) 
    {
        gooPanel.repaint();
        try 
        {
            Thread.sleep(frameTimeInMillis);
        } catch (InterruptedException e) {}
    }
}

public void draw(Graphics2D g) {}

public void setFrameTime(int millis)
{
    frameTimeInMillis = millis;
}

public Component getGooPanel () 
{
    return gooPanel;
}
}

Мой класс FallingDrop:

import java.awt.*;

public class FallingDrops extends Goo
{
    double x, y, r;
    int red, green, blue = 0;
    Color a;

FallingDrops() 
{
    x = width / 2;
    r = 10;
    y = -r;
}

FallingDrops(double x) 
{
    this.x = x;
    r = 10;
    y = -r;
}

public void draw(Graphics2D g) 
{
    g.setColor(Color.GRAY);
    g.fillRect(0, 0, width , height);
    g.setColor(Color.WHITE);

    g.fillOval ((int) (x - r), (int) (y - r), (int) (2 * r),
            (int) (2 * r));

    y++;
    if (y - r > height)
        y = -r;

}


public static void main(String [] args) 
{
    int num = 10;
    Goo gooDrop [] = new FallingDrops[num];

    for(int i = 0; i < gooDrop.length; i++)
    {
        double x = Math.random()*800;
        gooDrop[i] = new FallingDrops(x);
        System.out.println(x);
        gooDrop[i].go();
    }

}


}

При токе цикл не завершается при выполнении метода go ();Таким образом, на экране отображается только ОДИН объект, а не несколько, как указано в моем цикле.Это простое исправление, я уверен.Есть идеи, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Метод go () никогда не возвращается. когда он вызывается для первого объекта в массиве, он продолжает работать бесконечно. Вы должны либо сделать перекрашивание в отдельном потоке, который постоянно перекрашивается. или если вы хотите перекрасить только при добавлении капель, удалите метод while в вашем методе go

public void go() 
{

        gooPanel.repaint();
        try 
        {
            Thread.sleep(frameTimeInMillis);
        } catch (InterruptedException e) {}

}

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

2 голосов
/ 09 декабря 2011
while (loop) .. gooPanel.repaint();  

Не способ сделать заказную покраску.Установите Swing Timer и вызовите repaint() в методе actionPerformed() слушателя.

См. Урок Custom Painting в руководстве для получения подробной информации ирабочие примеры.

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