【发布时间】:2022-01-20 17:20:11
【问题描述】:
我有一个由多个多边形组成的 3d 对象,我使用 graphics2D 绘制。当我旋转它时,似乎没有足够的时间在每一帧上绘制整个对象,因为在某些帧上,一些多边形完全丢失(未绘制)。我不明白这是怎么回事,因为我在paintComponent 中首先将所有多边形绘制到bufferedImage myImg 上,然后将完成的图像绘制到屏幕上。当我删除 clearRect 时,这个问题得到了解决,但是它当然不会在绘制下一帧之前删除最后一帧的绘图。
注意:我是一个业余爱好者,但我已经非常努力地理解了,所以这是我最后的手段,我很高兴能得到一些帮助。代码(去掉不必要的代码如下):
public class Main {
long temp = System.currentTimeMillis() + frameRate;
public static void main(String[] args) {
myGUI = new GUI(width, height);
while(true) {
if (System.currentTimeMillis() >= temp) {
temp += frameRate;
rotateObject();
myGUI.myCanvas.myLabel.repaint();
}
}
}
}
public class GUI extends JFrame {
public Canvas myCanvas;
public GUI(int w, int h) {
this.setSize(w, h);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myCanvas = new Canvas(w, h);
this.getContentPane().add(myCanvas);
this.setVisible(true);
this.pack();
}
}
public class Canvas extends JPanel {
public BufferedImage myImg;
public Graphics2D g2d;
public JLabel myLabel;
public Canvas(int w, int h) {
myImg = new BufferedImage(w, h, BufferedImage.TYPE_4BYTE_ABGR);
myLabel = new JLabel(new ImageIcon(myImg));
this.add(myLabel);
g2d = myImg.createGraphics();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g2d.clearRect(0, 0, myImg.getWidth(), myImg.getHeight());
g2d.setColor(Color.RED));
g2d.fillPolygon(pointsX, pointsY, 3);
g.drawImage(myImg, 0, 0, null);
}
}
【问题讨论】:
-
你的代码连编译都没有,怎么会闪烁? (例如
while("every 33 ms") {- 你希望它做什么?)。请将可编译代码发布为minimal reproducible example。 -
你不需要
clearRect,已经搞定了 -
哦,天哪 -
g2d = myImg.createGraphics();,这不是在 Swing 中绘制的方式,永远,永远不要使用实时组件进行此操作
标签: java bufferedimage paintcomponent