2012-03-09 18 views
2

DBに作成されたクエリからJTableを読み込む作業者が関与するJavaプログラムSwingを実行していますが、これは正常に動作しますが、終了すると、done()メソッドにチェックがあります結果は次のように処理した:SwingWorker done()が2回呼び出されましたか?

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()メソッドが2回呼び出されていることだと思いますこれは、二回表示されますが、私はその理由だものを見つけることができませんということですそれともコードの問題か。

ここで参照するための完全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(); 
} 

任意のアイデア? ありがとうございます!

+0

うーん...うまくいけば、二度呼ばれたことは決して見られなかった。 Argghhはちょうど私の最後の答えでエラーを検出しました:プロセスは行を失っています、ループは第一チャンクから始めなければなりません。 – kleopatra

+2

は(私のバグの有無にかかわらず)再現できません。何か他のものでなければなりません。 2つのスレッドを開始するような何か狂った、まったく予期しないものを探します。 – kleopatra

+0

ちょうどそれが起こるのは、私がオプションペインの受け入れボタンを押すと、別のものがポップするということです。多分これは別のヒントを与える?? – Lowb

答えて

0

解決される問題は、労働者を作成していたメソッドの呼び出しを含むコードで何かをしなければならなかった、二つの異なる労働者によって固定

を作成したのと同じメソッドを呼び出すボタン上の2つの異なるイベントがありました最も制限的なイベントを削除します。

関連する問題