gpt4 book ai didi

java - SwingWorker done() 调用了两次?

转载 作者:行者123 更新时间:2023-11-29 09:15:39 24 4
gpt4 key购买 nike

我正在做一个 Swing java 程序,它涉及一个工作人员根据对数据库的查询来填充 JTable,这工作正常但是当它完成时,我进入了done() 方法检查是否有任何结果是这样处理的:

    public void done() {
if (isCancelled()) {
jLabelResultados.setText("Procesados " + tablaResultados.getModel().getRowCount() + " resultados.");
return;
}
try {
get();
if (tablaResultados.getModel().getRowCount() == 0) {
JOptionPane.showMessageDialog(jPanelClientes.getParent(), "No se encontraron resultados con los criterios de búsqueda definidos", "Sin resultados", JOptionPane.INFORMATION_MESSAGE);
} else {
jLabelResultados.setText("Encontrados " + tablaResultados.getModel().getRowCount() + " resultados.");
}

} catch (ExecutionException | InterruptedException e) {
LOG.log(Level.SEVERE, "Excepcion", e);
}
}

但我的问题是当结果为零时弹出出现了两次,这让我认为 done() 方法被调用了两次,但我无法找到是什么原因或者代码的问题。

完整的swingworker代码供引用:

private class Worker extends SwingWorker<Void, Object[]> {

private ResultSet resultado;
private JTable tablaResultados;
private DefaultTableModel modelo;

public Worker(ResultSet resultado, JTable tabla) {
this.resultado = resultado;
tablaResultados = tabla;
}

@Override
public Void doInBackground() throws Exception {

ResultSetMetaData metadata = resultado.getMetaData();
int columnas = metadata.getColumnCount();
Object[] etiquetas = new Object[columnas];

for (int i = 0; i < columnas; i++) {
etiquetas[i] =
metadata.getColumnName(i + 1);
}
publish(etiquetas);

while (resultado.next() && !this.isCancelled()) {
Object fila[] = new Object[columnas];
for (int i = 0; i < columnas; i++) {
fila[i] = resultado.getObject(i + 1);
}
publish(fila);
}
return null;
}

@Override
public void process(List<Object[]> chunks) {
if (modelo == null) {
modelo = new DefaultTableModel();
modelo.setColumnIdentifiers(chunks.get(0));
tablaResultados.setModel(modelo);
}
for (int i = 1; i < chunks.size(); i++) {
modelo.addRow(chunks.get(i));
}

}

@Override
public void done() {
if (isCancelled()) {
jLabelResultados.setText("Procesados " + tablaResultados.getModel().getRowCount() + " resultados.");
return;
}
try {
get();
if (tablaResultados.getModel().getRowCount() == 0) {
JOptionPane.showMessageDialog(jPanelClientes.getParent(), "No se encontraron resultados con los criterios de búsqueda definidos", "Sin resultados", JOptionPane.INFORMATION_MESSAGE);
} else {
jLabelResultados.setText("Encontrados " + tablaResultados.getModel().getRowCount() + " resultados.");
}

} catch (ExecutionException | InterruptedException e) {
LOG.log(Level.SEVERE, "Excepcion", e);
}
}
}

使用时:

  tarea = new Worker(resultado, jTableResultados);
PropertyChangeListener doneListener = new PropertyChangeListener() {

@Override
public void propertyChange(PropertyChangeEvent e) {
if (e.getNewValue() == SwingWorker.StateValue.STARTED) {
jButtonCancelar.setEnabled(true);
jProgressBar.setIndeterminate(true);
}
if (e.getNewValue() == SwingWorker.StateValue.DONE) {
jButtonCancelar.setEnabled(false);
jProgressBar.setIndeterminate(false);
}

}
};
tarea.addPropertyChangeListener(doneListener);
tarea.execute();
}

有什么想法吗?谢谢!!

最佳答案

问题已解决,必须对涉及调用创建 Worker 的方法的代码做一些事情,按钮上有两个不同的事件调用创建两个不同 Worker 的相同方法

通过删除最严格的事件进行修复。

关于java - SwingWorker done() 调用了两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9632393/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com