Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SwingWorker done()调用了两次?_Java_Swing_Swingworker - Fatal编程技术网

Java SwingWorker done()调用了两次?

Java SwingWorker done()调用了两次?,java,swing,swingworker,Java,Swing,Swingworker,我正在执行一个Swing java程序,该程序涉及一名工作人员从对DB的查询中填充JTable,这工作正常,但当它完成时,我在done方法中进行了一次检查,以查看是否有任何结果按如下方式处理: public void done() { if (isCancelled()) { jLabelResultados.setText("Procesados " + tablaResultados.getModel().getRowCount() + " r

我正在执行一个Swing java程序,该程序涉及一名工作人员从对DB的查询中填充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);
        }
    }
}
有什么想法吗?
谢谢

问题已解决,必须处理涉及对创建辅助对象的方法的调用的代码,按钮上有两个不同的事件,调用创建两个不同辅助对象的相同方法


通过删除限制性最强的事件进行修复。

问题已解决,必须处理涉及对创建辅助对象的方法的调用的代码,按钮上有两个不同的事件,调用创建两个不同辅助对象的相同方法


通过删除限制性最强的事件进行修复。

hmm。。。应该工作,从来没有见过一个做了叫两次。Argghh,刚刚在我的上一个回答中检测到一个错误:进程正在丢失行,循环应该只在第一批块的第二个块上开始,对于所有后续的块,它必须从第一个块开始。无论有没有我的错误,都无法复制-所以必须是其他的东西,不知道可能是什么。会搜索一些疯狂的、完全出乎意料的东西,比如启动两个线程左右。确切的情况是,当我按下选项窗格的“接受”按钮时,另一个线程弹出。也许这会给你另一个提示??不,对不起。对于初学者,尝试找出它们是否由相同或不同的工作者打开:f.i.添加一个名称参数并在optionPaneok中显示,添加了这个。toString在optionpane中不确定这是否是您的意思,但它明确显示了不同的字符串,一个是myclassWorker@1a47da2e,另一个myclassWorker@412e4ba3hmm ... 应该工作,从来没有见过一个做了叫两次。Argghh,刚刚在我的上一个回答中检测到一个错误:进程正在丢失行,循环应该只在第一批块的第二个块上开始,对于所有后续的块,它必须从第一个块开始。无论有没有我的错误,都无法复制-所以必须是其他的东西,不知道可能是什么。会搜索一些疯狂的、完全出乎意料的东西,比如启动两个线程左右。确切的情况是,当我按下选项窗格的“接受”按钮时,另一个线程弹出。也许这会给你另一个提示??不,对不起。对于初学者,尝试找出它们是否由相同或不同的工作者打开:f.i.添加一个名称参数并在optionPaneok中显示,添加了这个。toString在optionpane中不确定这是否是您的意思,但它明确显示了不同的字符串,一个是myclassWorker@1a47da2e,另一个myclassWorker@412e4ba3
  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();
}