嗨,我一直试图摆脱我在JFrame应用程序上的闪烁 . 已经搜索过并看到setDoubleBuffered(true)可以用于Jpanel的paintComponent,但不能用于JFrame的paint方法,也不能用于applet .
通过在paint方法中引入指令this.createbufferstrategy(2)来管理减少但不消除闪烁,并且使用指令this.setignorerepaint(true)在paint中进一步减少闪烁 .
但我终于找到了一个完全消除闪烁的代码示例,它通过在更新函数中绘制静态元素来工作 .
在applet中的更新中测试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,没有任何改变 .
1 回答
当使用
setIgnorePaint(true)
时,它不允许你搞乱图形 . 我绘制的图形g(在绘制方法中,你调用update(g))如果忽略paint,它将不允许你使用paintComponent的Graphic参数 . 发布包含图形的所有代码(您制定策略的位置,您调用此方法的位置,等等 . )
闪烁是这个策略的一个非常主流的问题,我不能保证我能够解决它(我的朋友不久之前把问题提到了我身上,但我并不在乎试图弄清楚它),但这应该至少解释为什么你的图形不渲染