JPanel的图形在左侧闪烁

时间:2015-01-31 23:50:52

标签: java swing graphics bufferedimage jcomponent

我有一个java程序应该做的非常简单。它包含JPanelrepaint()每秒被调用30次。这个JPanel会覆盖paintComponent()方法,在这个覆盖的方法中,我会使用BufferedImage并将其绘制到JPanel。

BufferedImage由黑色图像组成,其内部有一个稍小的蓝色矩形。这显示,但问题是屏幕的左侧,50-80像素左右闪烁。在应该是蓝色矩形的最左边部分,有些像素有时会显示为黑色,就好像有一些黑色覆盖从屏幕左侧延伸覆盖它,每帧都闪烁一点。

我不认为只绘制一个矩形会如此消耗,以至于它会导致像这样的图形错误;是吗?我无法弄清楚为什么会发生这种情况,所以你们中的任何一个人都知道什么会导致黑色"闪烁"在BufferedImageGraphics2D

的左侧

' Runnable示例(请添加导入)':

public class Panel extends JPanel{
public int width, height;
public long lastTime;
public BufferedImage canvas;
public Panel(int a, int b){
width = a;
height = b;
canvas = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
lastTime = System.currentTimeMillis();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g.drawImage(canvas, 0, 0, this);
}
public void drawRect(int startX, int startY, int w, int h, int color){
for(int i=0; i<w; i++){
for(int j=0; j<h; j++){
canvas.setRGB(i + startX, j + startY, color);
}
}
}
public void render(){
drawRect(0, 0, width, height, 0x000000);
drawRect(10, 10, width - 20, height - 20, 0x0000ff);
}
public void update(){
int delta = (int)(System.currentTimeMillis() - lastTime);
if(delta >= 1000 / 30){
render();
lastTime = System.currentTimeMillis();
}
}

//in a different class, contains main()

public class Main{
public static Panel pan;
public static void main(String[] args){
JFrame frame = new JFrame();
Container c = frame.getContentPane();
c.setPreferredSize(500, 500);
pan = new Panel(500, 500);
frame.add(pan);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
new runThread().run();
}
class runThread extends Thread{
public void run(){
while(true){
pan.update();
}

}
}
}

1 个答案:

答案 0 :(得分:2)

由于您的程序以多种方式错误地同步,因此结果是不确定的。必须在event dispatch thread上构建和操作Swing GUI对象 ;这是所有支持的平台上的 required 。如How to Use Swing Timers中所述,此example以50 Hz的频率运行,没有闪烁。

  

我有一个15级的课程......

在较大的程序中,您可以使用引用的here方法之一搜索违反EDT的行为。另请查看建议的动画技术here