我怎样才能阻止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 与取消按钮事件是不同的方法,因此我无法调用 Workercancel()
method.
尝试将工人作为该类的属性,但没有成功:
public class myClass extends javax.swing.JFrame {
private SwingWorker<Void, Object[]> tarea;
但当我去:
tarea = new SwingWorker<Void,Object[]>(){...}
我得到不兼容的类型,发现无效,需要 SwingWorker,我完全没有想法。
有小费吗?
Thanks