Я пытаюсь использовать потоки для выполнения операции увеличения длины в фоновом режиме и обновления пользовательского интерфейса. Вот что я пытаюсь сделать:Проблема с Java Thread - обновление GUI
- на кнопку мыши, отображается popupjframe с сообщением «Установка в БД»
- создать новый поток для вставки 1000s записей в базе данных.
- когда элементы вставлены, я хочу popupjframe исчезнуть и отображения JOptionPane с да, нет кнопки
- по нажатию кнопки да я хочу, чтобы отобразить другой кадр с докладом/сведения о процессе вставки
Вот мой код:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
//display popupframe first
jFrame1.pack();
jFrame1.setVisible(true);
jFrame1.setLocationRelativeTo(getFrame());
Thread queryThread = new Thread() {
public void run() {
runQueries();
}};
queryThread.start();
}
//runqueries method inserts into DB
private void runQueries() {
for (int i = 0; i <= 50000; i++) {
insertintoDB();
updateProgress(i);
}
}
//update the popupjframe
private void updateProgress(final int queryNo) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
if (queryNo == 50000) { //means insertion is done
jFrame1.setVisible(false);
int n = JOptionPane.showConfirmDialog(getFrame(), menuBar, null, JOptionPane.YES_NO_OPTION);
if (n == 1) { //NO option was selected
return;}
else
//display another popupframe with details/report of inserting process
}});
}
- Является ли мой подход правильным?
- Как и когда Я останавливаю/прерываю запрос «запрос»?
- Правильно ли, если я сделал popupjframe в методе runqueries (после цикла for) и отобразил joptionpane ??
Заранее спасибо.
В ваших runQueries() метод, вы вызываете UpdateProgress() 50000 раз, каждый раз создавая новый поток, в то время как только последний нужно сделать любую полезную работу. Это может быть не тяжело, но это лишние накладные расходы и вводящий в заблуждение код в лучшем случае. И ILMTitan верен: SwingWorker - это правильный способ пойти сюда. –