我一直在寻找可以在任何 UI 中使用的 CanvasFrame 的替代品,现在我有了。这是一个可以显示实时(或静止)图像的摇摆元素:
import java.awt.Graphics;
import java.awt.image.*;
import javax.swing.JPanel;
public class CamImagePanel extends JPanel {
private BufferedImage image;
public CamImagePanel() {
super();
// Note that at this point, image = null
// so be sure to call setImage() before setVisible(true)
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (image != null) // Not efficient, but safer.
g.drawImage(image, 0, 0, this);
}
public void setImage(BufferedImage img) {
image = img;
repaint();
}
}
然后,我在主事件线程中设置了一个定时器,每秒唤醒 20 到 30 次(30-50 毫秒),在闹钟回调方法中,我只需调用 mypanel.setImage(latestPhoto); 它就像一个实时图像。
我有一个控制器对象,它有自己的线程,它尽可能快地用来自相机的图像填充缓冲区,我只是向控制器询问最新的图像。这样,不需要同步,我实际上可以要求比相机更快或更慢的图像,而且我的逻辑仍然可以正常工作。
UI 上的一个按钮会停止计时器,我可以将最终图像留在面板上,或者使用 setVisible(false) 完全关闭面板。