SwingWorker done()调用了两次?

时间:2012-03-09 10:20:27

标签: java swing swingworker

我正在做一个Swing java程序,它涉及一个工作人员从一个对数据库的查询填充JTable,这很好但是当它完成时,我已经进入了{{1方法检查是否有任何结果处理如下:

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); } } 方法被调用了两次,但我无法找到原因是什么,或者问题是代码。

以下是完整的swingworker代码供参考:

done()

使用时:

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);
        }
    }
}

有什么想法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

问题解决后,必须对涉及调用创建Worker的方法的代码执行某些操作,按钮上有两个不同的事件,调用创建两个不同Worker的相同方法

通过删除限制性最强的事件来解决。