gpt4 book ai didi

java - SwingWorker 结束,PropertyChangeListener 监听,但我如何返回 EDT?

转载 作者:行者123 更新时间:2023-12-04 17:18:16 24 4
gpt4 key购买 nike

我已经浏览过很多关于这个主题的帖子,但似乎没有什么适合我的具体情况。

我有一个 swing 应用程序,它分析 QR 码,提取找到的登录名并进行数据库调用以获取该用户的数据。为了确保可以取消 QR 码的捕获并且在捕获时我的应用程序仍然可以访问,我为此使用了 SwingWorker。到目前为止一切正常,我包含了一个 PropertyChangeListener,因此应用程序知道我的 SwingWorker 何时成功读取代码。但由于我不想将 PropertyChangeListener 作为我的 mainClass 中的嵌套类(以保持其良好的结构),我在外部为其创建了一个新类。现在我想从此 PropertyChangeListener 类返回到我的主类以切换到显示获取的数据的适当面板。我有不同的代码可以读取,所以根据代码我有不同的面板可以切换到(所以我不能一遍又一遍地静态切换到同一个面板)。那么我如何委托(delegate) PropertyChangeListener 将控制权交还给我的 EDT 呢?我试过使用 wait() 和 notify() 让我的 EDT 知道 SwingWorker 完成了。但显然 wait() 阻止了我的 EDT,并且使用 SwingWorker 毫无意义。

我希望我能足够详细地解释我的问题,并且你们中的一些人有处理这个问题的好主意。对于任何代码片段,请询问,然后我将添加必要的代码片段。但由于我的项目有点复杂,我只会发布要求的内容。

在此先感谢您的帮助:)

编辑:这是一段代码摘录,用于说明我的 SwingWorker 正在做什么。

SwingWorker 类:

public class CodeDetector extends SwingWorker<byte[], String> {

String s; // read String
byte[] completeCode; // byte[] which is returned by doInBackground()
BufferedImage resizedImg;
IplImage img;
JLabel labelForStream;
JLabel result;
FrameGrabber grabber = new VideoInputFrameGrabber(); // using JavaCV.


public CodeDetector(JLabel labelForStream, JLabel result) {
this.labelForStream = labelForStream;
this.resultLabel = result;
}

@Override
protected byte[] doInBackground() throws Exception {
try {
grabber.start(); //
while (true) {
// End if current thread was canceled.
if (Thread.currentThread().isInterrupted()) {
return null;
}

// Grab each image, save it, scan for code and display it.
img = grabber.grab();
resizedImg = // resizing image to fit labelForStream.
// save resizedImg to file
// read barcode from saved file
if (isBadgeCode(tmp) || isDeviceCode(tmp)) {
s = tmp;
} else {
continue;
}
break;
} catch (NotFoundException e) {
// Code could not be encoded yet.
}
...

// end worker after timeout

// show image on window
if (img != null) {
labelForStream.setIcon(new ImageIcon(resizedImg));
}
}
}
} catch (Exception e) {
System.err.println("Error: " + e.getMessage() + " - " + e.getStackTrace() + " - " + e.getClass());
}
return s != null ? s.getBytes() : null;
}

@Override
protected void done() {
try {
completeCode = get();
if (completeCode != null) {
String code = new String(completeCode);
if (isOtherCode(code)) {
resultLabel.setText(code);
} else if (isUsernameCode(code)) {
// Cut userName from read code (if previously verified) and set label text.
resultLabel.setText(verify(code, true) ? code.split(":")[0] : null);
}
} else {
resultLabel.setText(null);
}
resultLabel.setVisible(true);
resultLabel.updateUI();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (CancellationException e) {
return;
} catch (Exception e) {
e.printStackTrace();
}
}

因为这个 SwingWorker 没有对任何面板的引用,即使 done() 方法是在 EDT 中完成的,我需要以某种方式通知我的 mainClass 代码已被成功读取并且它现在可以更改面板根据具体代码。

希望这能让事情变得更清楚一些。

最佳答案

我认为你误解了,原因是什么SwingWorker有吗,请看SwingWorkertutorial ,其中实现完全保证从方法输出:

  • 完成()

  • 进程()

  • 发布()

  • setProgress()

应该在 EDT 上完成

关于java - SwingWorker 结束,PropertyChangeListener 监听,但我如何返回 EDT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10230659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com