java - 如何使用paintComponent(Graphics g)绘制存储在 vector 中的对象

标签 java swing animation graphics vector

我想知道如何将对象存储在 vector 中,然后稍后使用 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);

}

}

我也不确定我是否在 vector 中添加了正确的对象,如果我这样做的话 System.out.println(内容);我刚刚得到一个带有 2 个空元素的 vector 。

Breakout.ball 和 paddle 元素都是 2 个矩形。如果我尝试直接绘制它们,就像我到目前为止在底部所做的那样,它工作得很好,但是当我想添加 20 多个砖 block 时,我需要将所有对象存储在一个 vector 中,然后将其全部绘制出来。

如果有人得到一些好的指示,或者一个好的教程的链接,那就太好了!

编辑:突破类的一部分

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);       
}
}

最佳答案

你应该做的是让每个对象类(如果它们偶数类,在我看来,它们应该是),实现 Drawable接口(interface),具有单个draw(Graphics g)方法。

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

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

然后可以输入 vector (我建议使用列表)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 的对象接口(interface)进入List<Drawable>

<小时/>

查看一些示例 herehereherehereherehere绘制多个对象并使用 javax.swing.Timer 对于动画,也许您想考虑这样做。

关于java - 如何使用paintComponent(Graphics g)绘制存储在 vector 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22801298/

相关文章:

java - 使用 PDFBox 填写表单时如何替换丢失的字体?

java - 如何知道 Swing 中两个线程何时完成

java - 当前jframe被释放时如何设置前一个jframe可见

java - 保留默认 UI,同时更改某些方面

javascript - jQuery:滚动时平滑的动画字体大小变化

java - 如何检查两个对象是否属于同一类?

java - 如何将 LocalDate 转换为 SQL Date Java?

ios - "insetGrouped"样式中单元格预览的圆角 (iOS 13)

android - 如何为 ListView 中的单个元素设置动画

javascript - 检测 WebView 内的可用内存