0

嗨,我一直在努力摆脱 JFrame 应用程序上的闪烁问题。搜索了一下,发现setDoubleBuffered(true)可以用于Jpanel的paintComponent,但不能用于JFrame的paint方法,也不能用于applet。

通过在 paint 方法中引入指令 this.createbufferstrategy(2) 来减少但不能消除闪烁,并在 paint 中使用指令 this.setignorerepaint(true) 进一步减少闪烁。

但我终于找到了一个完全消除闪烁的代码示例,它通过在更新函数中绘制静态元素来工作。

在小程序的更新中测试了 fillRect 并且它可以工作,但是当复制粘贴到常规的 Java 应用程序中时,它在 jframe 的更新函数中不起作用。

这是代码

   Graphics graphics;
   Image image;
   public void update(Graphics g)
   {
   if (image == null) {  

   image = createImage(this.getWidth(), this.getHeight());

   graphics = image.getGraphics();  }

   graphics.setColor(Color.blue);

   graphics.fillRect(0,  0,  this.getWidth(),  this.getHeight());

   g.drawImage(image, 0, 0, this);//}

使用一个空的绘图功能,它可以在小程序中绘制到屏幕并用蓝色填充它,它还可以消除闪烁。但在 jframe 的正常应用程序中,它什么也不做。

需要做什么才能允许 fillRect 或 drawImage 在非 applet 常规应用程序环境的更新中工作?

顺便说一句,如果图形对象通过调用fillRect自行修改,我对此有点陌生,那如何修改图像对象?因为 drawImage 是屏幕变蓝所必需的。

PS我试过不同时使用createbufferedstrategy和setignorerepaint,没有任何改变。

4

1 回答 1

1

使用时setIgnorePaint(true),它不允许您弄乱图形。我猜测你的 update(Graphics g) 参数的外观,你在你的paint方法中调用它,使用paintMethod的图形g来绘制(在paint方法中,你调用update(g))

如果你忽略了paint,它就不允许你使用paintComponent 的Graphic 参数。发布所有包含图形的代码(您制定策略的位置,调用此方法的位置等......)

闪烁是该策略的一个非常主流的问题,我不能保证我能够解决它(我的朋友不久前向我提出了这个问题,但我并没有足够在意去尝试解决它),但这至少应该解释为什么你的图形没有渲染

于 2013-09-15T00:02:57.877 回答