【发布时间】:2015-04-28 23:35:36
【问题描述】:
我知道在挥杆中你打算使用重绘来重绘面板,但我开始制作游戏并且读到重绘在时间方面是不可靠的。所以我正在尝试制定一个策略,创建一个 BufferedImage,将我需要的所有东西绘制到该对象的图形对象上,然后使用 drawImage 方法将图像绘制到我的 jpanel。
我正在调用 dispose 让面板重新渲染,但它只在某些时候工作。下面只是一个例子。如果您继续运行此程序,则 BufferedImage 只会在您运行它的大约 3/10 次时被绘制。有人可以向我解释一下吗?
public class TestMain {
public static void main(String[] args) throws InterruptedException {
JFrame jf = new JFrame();
MyPanel mp = new MyPanel();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLocation(50, 500);
jf.add(mp);
jf.pack();
jf.setVisible(true);
mp.draw();
}
}
public class MyPanel extends JPanel {
private static final long serialVersionUID = 1L;
BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d;
public MyPanel() {
super();
setPreferredSize(new Dimension(300, 300));
}
public void draw() {
System.out.println("In draw");
g2d = (Graphics2D) img.getGraphics();
g2d.drawString("Test", 10, 10);
Graphics g = getGraphics();
g.drawImage(img, 0, 0, this);
g.dispose();
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("In paintComponent");
}
}
我在幕后与经常阻碍平局的事情作斗争。我意识到调整窗口大小等会调用重绘并覆盖我的绘图,但是当我不这样做时,它应该每次都显示出来,不是吗?
编辑:有趣...如果我将 draw 方法包装在一个连续的 while 循环中,它“有效”。但这并不能回答我的问题。我不应该需要不断地回忆这个方法来给人一种画得很好的错觉。
【问题讨论】:
-
在
jf.setVisible(true);之前尝试添加jf.revalidate();jf.repaint(); -
@MaVRoSCy 不。结果相同。每隔几次运行绘制一次。
-
在显示帧后调用
draw()方法。 (在 WindowOpened 操作中,我建议..) -
我推荐阅读Killer Game Programming in Java的第2章(实际上推荐整本书):fivedots.coe.psu.ac.th/~ad/jg/ch1/index.html