SwingWorker在JLabel图标更新时锁定GUI(不成功)



好吧,我真的很难解锁我的GUI,因为SwingWorker线程分离而被锁定。我的程序基本上是这样做的:初始化网络摄像头,然后抓取单个帧并将其显示为JLabel图标(点击按钮进行单个抓取+显示很容易,但为了进行一些图像处理,我在连续进行这样的操作时遇到了巨大的困难(。我的目标是获得这样的结果:

抓斗框架->处理它->显示为Jlabel>的ImageIcon。。。重复抓取帧>。。。

当网络摄像头正在流式传输时,我需要结果,因此我使用了SwingWorker publishprocess。在我的代码中";处理部分";不包括在内,因为这是不必要的,因为我甚至无法获得适当的连续帧抓取。一般来说,除非取消,否则我的背景线程永远不会完成(这是我的假设,因为我想以每秒最大帧数尽可能快地处理图像-除非我应该用其他方式来处理?-我想单独的线程进行单帧抓取和处理是个坏主意,因为我的目标是获得10+FPS(。我知道我的SwingWorker线程是有效的,因为我测试了将连续图像保存到C:\,它确实有效,但我的GUI无论如何都被锁定了,但至少我知道线程正在运行并获取帧。

通常我有两个问题:

  • 没有JLabel图标更新
  • 锁定的GUI

我的SwingWorker代码:

private class FrameStream extends SwingWorker<Void, BufferedImage> { 
    @Override
    protected Void doInBackground() throws InterruptedException{
        BufferedImage processedImage = null;
        
        while (!isCancelled()) {
            processedImage = getPIC_COLOR(player);
            publish(processedImage);
            
            Thread.sleep(5000); // i made such delay to check whether program is not "choking" with data, but its not the case, without this delay everthing is the same
        }            
        return null;
    }
    @Override
    protected void process(List<BufferedImage> mystuff) {
        Iterator it = mystuff.iterator(); 
        while (it.hasNext()) {
            img_field.setIcon(new ImageIcon(mystuff.get(mystuff.size()-1)));
        }
    }
    @Override
    protected void done() {            
        infoBAR.setText("FINISHED");
    }
}

我非常绝望,以至于我完全根据教程重写了我的代码。例如:Flipper,正如你所看到的,它非常相似。我之前的所有努力也锁定了gui,所以尝试了"教程方式",但没有成功,这很遗憾。我陷入了死胡同,因为我不知道如何解决这个问题。我迫切需要帮助,因为正如你所看到的,它似乎与教程中的完全相同,可能是其他原因导致了问题:我的完整代码

请帮忙,我自己解决不了。

有一件事对我来说有点不同,那就是您的流程方法。与其指定最后一个图像,不如像这样迭代所有图像:

  @Override
  protected void process(List<BufferedImage> mystuff) {
     for (BufferedImage bImage : mystuff) {
        img_field.setIcon(new ImageIcon(bImage));
     }
  }

我不确定这是否会产生重大影响,但我相信这就是流程应该如何编写的。另一个想法是——如果BufferedImages很大,您可能希望在后台线程中创建ImageIcon,并发布ImageIcon而不是BufferedImage。

没有什么突出的问题。我建议进一步调试的步骤。

不使用循环和process方法,只需拉动一帧并设置一次Icon即可。在你试图让它循环之前,你需要让它发挥作用。您的应用程序应该能够设置图标,即它不会突出显示问题。

第二,因为您的GUI正在锁定,所以EDT上仍有一些事情发生。尝试运行探查器或在代码中添加System.out.println,以查找GUI锁定时正在运行的内容。

最后,确保您不需要重新绘制,重新验证标签的容器以使图像可见。

hmmmm,如果我读了你关于这个问题的上一篇文章,可能会有很多错误(我看到了你的代码(,这与SwingWorker无关,另一个例子只是用你的图标或ImageIcon 替换JButton#setBackground((的change Color

您是否尝试设置标签以观察图像图标?

icon.setImageObserver(label);

相关内容

  • 没有找到相关文章

最新更新