Я уже просмотрел много тем по этой теме, но ничего не подходит для моей конкретной ситуации.
У меня есть свинг-приложение, которое анализирует QR-коды, извлекает найденные имена входа и выполняет вызовы БД для получения данных для этого пользователя. Чтобы убедиться, что захват QR-кодов можно отменить, а мое приложение по-прежнему доступно во время захвата, я использовал для этой цели SwingWorker. Пока все работает нормально, я включил PropertyChangeListener, чтобы приложение знало, когда мой SwingWorker успешно прочитал код. Но так как я не хочу, чтобы PropertyChangeListener был вложенным классом внутри моего основного класса (чтобы он оставался хорошо структурированным), я создал для него новый класс снаружи. Теперь я хочу вернуться к своему основному классу из этого класса PropertyChangeListener, чтобы переключиться на соответствующую панель, которая отображает извлеченные данные. У меня есть разные коды, которые можно прочитать, поэтому в зависимости от кода у меня есть разные панели для переключения (поэтому я не могу выполнять статическое переключение на одну и ту же панель снова и снова). Итак, как я могу делегировать 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, мне нужно как-то уведомить мой основной класс, что код был успешно прочитан и что теперь он может изменить панель в соответствии с конкретный код.
Надеюсь, это немного прояснит ситуацию.
done()
? - person Jason Braucht   schedule 19.04.2012JPanel
s - person nIcE cOw   schedule 19.04.2012