У меня есть JAVA6 GUI обработка данных импорт в нашу базу данных. Я реализовал рабочий JProgressBar. Я понимаю, что изменения, внесенные в GUI, должны выполняться через поток отправки событий, который я не думаю, что я делаю (правильно/вообще).Swing Progress Bar обновляется через Worker to EventDispatch thread
фона рабочего потока, UploadWorker, строится путем пропускания в виде JProgressBar, созданной в основной программе, и устанавливает изменяет значение индикатора выполнения непосредственно после его Выполнил:
// when constructed, this gets set to the main program's JProgressBar.
JProgressBar progress;
protected Void doInBackground() throws Exception {
write("<!-- Import starting at " + getCurrentTime() + " -->\n");
boolean chunked = false;
switch (importMethod) {
//do some importing
}
write("<!-- Import attempt completed at " + getCurrentTime() + "-->\n");
//here changes to the GUI are made
progress.setMaximum(0);
progress.setIndeterminate(false);
progress.setString("Finished Working");
return null;
}
Это прекрасно работает , но иногда (не всегда) бросает мне несколько НЭП в станд вне, и пользователи жалуются:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(Unknown Source)
...etc...
во всяком случае, я считаю, есть что-то, что нужно сделать, чтобы получить эти обновления, выполняемые на соответствующую нить, правильно ? Как?
только что обнаружил SwingUtilities.isEventDispatchThread, очень полезно и, как я подозревал, возвращает ложь. – tenwest
Поскольку вы взаимодействуете с индикатором выполнения в методе doInBackground, я бы сказал, что вы, безусловно, нарушаете правила единственного потока Swing – MadProgrammer
Мне всегда нравится этот [пример рабочего swing] (http://www.javacreed.com/swing-worker-example /) – nachokk