Как я могу остановить SwingWorker
делать свою работу? Я знаю, что для этого есть метод cancel()
, но самое большее, что я мог сделать, это анонимно создать новый SwingWorker
, который выполняет эту работу.
Вот код для справки:
public void mostrarResultado(final ResultSet resultado) {
new SwingWorker<Void, Object[]>() {
@Override
public Void doInBackground() {
// TODO: Process ResultSet and create Rows. Call publish() for every N rows created.+
DefaultTableModel modelo = new DefaultTableModel();
jTableResultados.removeAll();
int columnas;
int res = 0;
try {
ResultSetMetaData metadata = resultado.getMetaData();
columnas = metadata.getColumnCount();
Object[] etiquetas = new Object[columnas];
jProgressBar.setIndeterminate(true);
for (int i = 0; i < columnas; i++) {
etiquetas[i] =
metadata.getColumnName(i + 1);
}
modelo.setColumnIdentifiers(etiquetas);
jTableResultados.setModel(modelo);
while (resultado.next() && !this.isCancelled()) {
res++;
Object fila[] = new Object[columnas];
for (int i = 0; i < columnas; i++) {
fila[i] = resultado.getObject(i + 1);
}
modelo.addRow(fila);
publish(fila);
}
jProgressBar.setIndeterminate(false);
if (res == 0) {
JOptionPane.showMessageDialog(jPanelClientes.getParent(), "No se encontraron resultados con los criterios de búsqueda definidos", "Sin resultados", JOptionPane.INFORMATION_MESSAGE);
}
} catch (SQLException ex) {
LOG.log(Level.SEVERE, "Excepcion: ", ex);
JOptionPane.showMessageDialog(jPanelClientes.getParent(), "Error en al ejecutar la busqueda seleccionada", "Error", JOptionPane.ERROR_MESSAGE);
}
return null;
}
}.execute();
}
На самом деле работа выполнена хорошо и опубликована без проблем, но, учитывая, что я работаю с БД, может случиться так, что у запроса будет слишком много результатов, и время, необходимое для полной публикации, займет время, поэтому пользователь должен иметь возможность отменить задачу и запустить новую.
Очевидно, что рабочий - это другой метод, нежели событие кнопки отмены, поэтому я не смогу вызвать метод Worker cancel()
.
Попытка сделать работника атрибутом для класса безуспешно:
public class myClass extends javax.swing.JFrame {
private SwingWorker<Void, Object[]> tarea;
но потом, когда я иду на:
tarea = new SwingWorker<Void,Object[]>(){...}
Я получаю несовместимые типы, найден недействительным, необходим SwingWorker, и у меня совершенно нет идей.
Какие-нибудь советы?
Спасибо