繁体   English   中英

如何使用paintComponent(Graphics g)绘制存储在向量中的对象

[英]How to draw objects stored in a vector with paintComponent(Graphics g)

我想知道如何将对象存储在矢量中,然后使用paintComponent(Graphics g)方法绘制它们。

我的绘画课是atm:

import java.awt.*;
import java.util.Vector;
import javax.swing.*;

public class PaintingPanel extends JPanel{

public static Rectangle playField = new Rectangle(10, 10, 800, 800);
public static int playFieldCentreX = 399;
public static int playFieldCentreY = 399;

public static Vector contents;

public PaintingPanel(Vector contents)
{   
    contents = new Vector();
    contents.addElement(Breakout.paddle);
    contents.addElement(Breakout.ball);



}

public void paintComponent(Graphics g)
{

    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g;
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

    g2d.draw(playField);
    Breakout.paddle.paintThis(g2d);
    Breakout.ball.paintThis(g2d);

}

}

如果我做System.out.println(contents),我也不确定我是否在向量中添加了正确的对象。 我只得到一个带有2个null元素的向量。

Breakout.ball和paddle元素都是2个矩形。 如果我尝试直接绘制它们,因为我到目前为止在底部它工作正常,但它当我想添加像20+砖我需要将所有对象存储在一个向量中,然后将其全部绘制出来。

如果有人得到了一些好的指针,或者链接到一个很好的教程!

编辑:突破类的一部分

public class Breakout extends TimerTask implements KeyListener {                
public static Ball ball;
public static Paddle paddle;
public static PaintingPanel panel;
public static boolean gameRunning;
public static Breakout game;    
public Breakout()
{

}   
public static void setupGame()
{
    paddle = new Paddle(350, 790, 100, 10); //initial paddle creation                           
    ball = new Ball(393, 400, 7);

    showGUI();
}   
public static void beginGame()
{
    gameRunning = true;         
}   
public void run()
{
    if(gameRunning == true)
    {
        Ball.move();
        Paddle.move();

    }
}
}   
public static void main(String[] args)
{   
    Timer t = new Timer();  
    t.schedule(new Breakout(), 0, 40);

    panel = new PaintingPanel(PaintingPanel.contents);
    setupGame();
    beginGame();    

    while (gameRunning == true)
    {
            panel.repaint();
    }       

    // TODO a lot
}
private static void showGUI()
{       
    JFrame frame = new JFrame("Breakout");  
    game = new Breakout();                   

    frame.addKeyListener(game);

    frame.add(panel);

    frame.setSize(1000,1000);
    frame.setLocationRelativeTo(null);                          //  create game window
    frame.setVisible(true);                                 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);       
}
}

你应该做的是拥有每个对象类(如果它们偶数类,它们应该是IMO),使用单个draw(Graphics g)方法实现Drawable接口。

public interface Drawable {
    public void draw(Graphics g);
}

public class Ball implenents Drawable {
    @Override
    public void draw(Graphics g) {
        // draw ball
    }
}

然后Vector(我推荐一个List代替)可以输入Drawable 然后你可以循环遍历它,调用每个对象的draw方法。 (这是将所有Drawable对象添加到它之后。

public class PaintingPanel extends JPanel {
    private List<Drawable> objects;
    BreakOut breakOut;

    public PaintingPanel(BreakOut breakout) {
        this.breakOut = breakOut;
        this.objects = breakOut.getSomething();
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (Drawable object: objects) {
            object.draw(g);
        }
    }
}

IMO,这将是更好的设计。 因此,您可以将实现Drawable接口的任何对象添加到List<Drawable>


在这里这里以及此处此处以及此处此处查看一些示例,绘制多个对象并使用javax.swing.Timer进行动画,这可能是您想要考虑的。

我们需要看看你的Breakout课程,知道你是否真的添加了任何东西。 如果它们是空对象,则意味着它们从未被实例化。 因此,基本上,调用构造函数并使用其返回的对象引用分别分配Breakout.paddleBreakout.ball

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM