2016-07-21 17 views
1

Ich habe ein Problem in meiner Swing-App.Swing App stürzt ab, wenn minimiert

Ich habe eine SwingWorker, die eine for-Schleife innerhalb hat, die 300+ Oracle Datenbankanforderungen startet und mehrere JTable s mit den Ergebnissen füllt.

Wenn ich das Swing-App-Fenster nicht minimiert oder zumindest teilweise im Windows Explorer sichtbar halte, wird der Batch vollständig ausgeführt. Wenn ich die App nun minimiere und dann zurück zur Swing-App gehe, wird sie eingefroren.

Grundlegende Umrisse und Farben der Komponenten werden sichtbar sein, das meiste Fenster wird nur von der Hintergrundfarbe sein, die ich darauf eingestellt habe (schwarz) und kein Text wird sichtbar sein. Die einzige Möglichkeit, die App zu beenden, besteht darin, den Prozess zu beenden, da ich durch Klicken auf die Schaltfläche "X" das Fenster nicht schließen kann.

Ist das ein häufiges Problem? Wie verhindern Sie das?

Schleife innerhalb des Batch-Arbeiter:

for(int i=1; i<=maxDepth; i++){ 
    String[] result = getAllLists(database, i); 
    for(int j=0; j<result.length; j++){ 
     String period=result[j]; 
     for(String name : names){ 
      System.out.println("New Query: "+name+ " " + period + " | " + "Loading " + (days) + " days x " + years + " years --- "); 
      if(isValid(period,name)){ 
       List<TickHistory> queryResult = model.getByDaysMultiple(name,period,days+mod+daysHeadroom,years, false); 
       getModelTableData(name, period, DatabaseHelpers.dateToString(lastCob), years,days,queryResult); 
       populatePricesTable(queryResult, days, false); 
       view.setNameText(name); 
       view.setPeriodText(period); 
      }else{ 
       System.out.println("query invalid"); 
      } 
     } 
    } 
} 
+1

Können Sie uns bitte einen Code zeigen? Vermutlich fehlt Ihnen 'SwingUtilities.invokeLater()'. Überprüfen der App mit jvisualvm könnte auch helfen. –

+1

Keine Ausnahmen? Verwenden Sie 'publish' &' process' korrekt? –

+0

@TamasRev Ich benutze invokelater im Hauptprozess, wo ich den Hauptrahmen, Controller und das Objekt, das ich benutze, um eine Verbindung zur Datenbank herzustellen – LucasSeveryn

Antwort

3

I publish und process nicht überall in meinem Code verwenden.

Dies ist eine wahrscheinliche Quelle des Problems. SwingWorker benötigt publish() in doInBackground() und process(), um die TableModel auf dem Ereignisversand Thread zu aktualisieren. Ein vollständiges Beispiel wird untersucht here.

image

+0

Ich habe die Schleife aus dem Batch-Worker zu der Frage hinzugefügt. Sie können die Methoden 'getByDaysMultiple' sehen, die Daten von db abrufen, dann gibt es' getModelTableData', das weitere Anfragen auslöst und dann 'populatePricesTable', das JTable füllt, und einige Ansichtsmethoden darunter. Es ist meine erste Swing-App, also schätze ich deine Erklärungen. – LucasSeveryn

+0

Sie müssen das 'TableModel' nicht von' doInBackground() 'aktualisieren. Sie müssen Ihren Code auf "publish()" Zwischenergebnisse umstellen, wie in der [turorial cited] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/interim.html) gezeigt. Wenn Sie Probleme haben, bearbeiten Sie Ihre Frage so, dass sie eine [mcve] enthält, die auf dem Beispiel basiert (http://stackoverflow.com/a/34742409/230513), das Ihren Ansatz zeigt. – trashgod