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();
}
任意のアイデア? ありがとうございます!
うーん...うまくいけば、二度呼ばれたことは決して見られなかった。 Argghhはちょうど私の最後の答えでエラーを検出しました:プロセスは行を失っています、ループは第一チャンクから始めなければなりません。 – kleopatra
は(私のバグの有無にかかわらず)再現できません。何か他のものでなければなりません。 2つのスレッドを開始するような何か狂った、まったく予期しないものを探します。 – kleopatra
ちょうどそれが起こるのは、私がオプションペインの受け入れボタンを押すと、別のものがポップするということです。多分これは別のヒントを与える?? – Lowb