Panneaux de peinture en Java


J'essaie donc de peindre plusieurs panneaux en même temps. Tout d'abord, j'ai la classe abstraite dont je cherche à peindre les instances:

public abstract class GameObject extends JComponent implements ActionListener
{
    public double x;
    public double y;
    public double velX;
    public double velY;
    public Dimension dim;
    public abstract void actionPerformed (ActionEvent e);
}

, Puis l'enfant:

public class Ball extends GameObject implements ActionListener
{
    public final double DEF_X = 0;
    public final double DEF_Y = 0;
    public final double DEFAULT_SIZE = 20;

    public Timer t = new Timer(5, this);

    public Ball (int aVelocity)
    {
        x = DEF_X;
        y = DEF_Y;
        velX = aVelocity;
        velY = aVelocity;
        dim = new Dimension((int) DEFAULT_SIZE, (int) DEFAULT_SIZE);

        t.start();
    }

    public void paintComponent (Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        Ellipse2D circle = new Ellipse2D.Double(x, y, dim.getWidth(), dim.getHeight());
        g2.fill(circle);
    }

    public void actionPerformed (ActionEvent e)
    {
        if (x < 0 || x > 560)
        {
            velX = -velX;
        }
        if (y < 0 || y > 360)
        {
            velY = -velY;
        }

        x += velX;
        y += velY;

        repaint();
    }
}

Donc, dans le pilote, je veux que 2 instances de balle se déplacent en même temps. Après avoir fait deux balles, j'ai essayé d'ajouter les deux à un JFrame, mais une seule va peindre. J'ai essayé d'ajouter les deux balles à un JPanel p principal, puis j'ai ajouté p à mon JFrame, mais cela n'a peint aucun d'entre eux.

public class Game
{
    public static void main(String[] args)
    {
        JFrame f = new JFrame();
        JPanel p = new JPanel();
        Ball b1 = new Ball(5);
        Ball b2 = new Ball(10);

        p.add(b1);
        p.add(b2);
        f.add(p);
        // I also tried just doing f.add(b1) and f.add(b2), but those only display 1 ball.

        f.setSize(620, 440);
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        f.setLocation(dim.width/2-f.getSize().width/2, dim.height/2-f.getSize().height/2);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setResizable(false);
        f.setVisible(true);
    }
}

Alors que puis-je faire pour remédier à cela et avoir les deux balles peintes en même temps?

Author: Andrew Thompson, 2018-03-31