2012-03-01 45 views
1

我在后台线程上创建和更新BufferedImage。然后通过覆盖如图所示的面板涂料方法将图像绘制到JPanel上。从后台线程更新缓冲图像

@Override 
public void paint(Graphics g) { 
    g.drawImage(image, 0, 0, null); 
} 

后台线程定期更新图像,然后调用面板invalidate方法。

我会遇到这种方法的任何问题吗?摆动线程读取和后台线程更新映像是否会导致任何问题?

感谢

+0

它取决于,如果您在更新图像时同时绘制(通过AWT线程),则会出现问题。线程同步。 – Adrian 2012-03-01 21:51:16

+1

另一方面,“Swing程序应该重写'paintComponent()',而不是重写'paint()'。” - [在AWT和Swing中绘制:绘制方法](http://java.sun.com/products/) JFC/TSC /用品/绘画/ index.html的#回调)。 – trashgod 2012-03-01 23:11:40

+1

1)除了trashgod提到的内容外,请注意,作为'drawImage'的最后一个参数传递的'null'参数是'ImageObserver'。由于'JPanel实现了ImageObserver',它应该是'g.drawImage(image,0,0,this);'。 2)除非你拉伸图像来填充该面板,或者在顶部添加其他组件,否则我会使用'JLabel'来显示它。 3)如果拉伸图像,但**不**叠加组件,则在'JComponent'中渲染。 – 2012-03-02 06:40:03

回答

1

两个线程必须同步访问共享数据。 SwingWorker是定期发布BufferedImage最可靠的方法;有一个例子here使用Double。您也可以查看here示例,该示例依赖于EventQueuerepaint()提供的(隐式)排序。无论哪种情况,限制因素都是相对于重绘时间的计时器频率。

+0

我最终做的是在后台线程中创建映像的副本。 JPanel实现了一个后台线程调用传递拷贝的回调接口。然后JPanel使用'SwingUtilities.invokeLater'将JPanel设置为一个变量并调用它自己的重绘。 – benshort 2012-03-05 08:29:22