SwingWorker сделано () вызывается дважды? - PullRequest
2 голосов
/ 09 марта 2012

Я делаю 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();
}

Есть идеи?Спасибо !!

1 Ответ

0 голосов
/ 12 марта 2012

Проблема решена, пришлось что-то делать с кодом, включающим вызовы метода, который создавал Worker, на кнопке было два разных события, вызывающих один и тот же метод, который создал двух разных Workers

Исправлено путем удаления наиболее ограничивающего события.

...