danvan Geschrieben 25. Juli 2009 Geschrieben 25. Juli 2009 hallo, also ich lasse einen swingworker ein paar aufgaben erledigen, am ende soll dann kurz im ladefenster ein label eingeblendet werden, das anzeigt: "Beendet", und der thread wird 2 sekunden unterbrochen. der entsprechende code, der sich auf die änderung der oberflöäche bezieht, ist in der done()-methode des workers, die im EDT ausgeführt wird. ich habe auch sicherheitshalber en abfrage gemacht, liefert true, also ist im EDT. ich habe es auch manuell versucht, um fehlprogrsmmierung meinerseits auszuschließen. warum wird die anzeige trotzdem nicht aktualisiert, wenn ind er done-methode soetwas steht wie: jLabel2.setVisible(true); ? lg Zitieren
perdian Geschrieben 29. Juli 2009 Geschrieben 29. Juli 2009 Ohne konkreten Code läuft das sehr auf Glaskugelanalyse hinaus. Als Idee: Schon versucht einen expliziten repaint bzw. validate auszulösen? Zitieren
danvan Geschrieben 29. Juli 2009 Autor Geschrieben 29. Juli 2009 (bearbeitet) hallo, ja das habe ich auch schon versucht. Allerdings sollte doch bei jLabel2.setVisible(true); das sowieso neu gezeichnet werden, oder? hier ist mal der code, bei klick wird halt die actionPerformed aufegrufen. Season ist ne Fachkonzeptklasse, ProgressView ist einfach s ein fenster mit progressbar und nem Label "beendet", das aber unsichtbar ist. public void actionPerformed(ActionEvent evt) { [...] newSeason = new Season(1,teams.toArray(new String[18])); view = new ProgressView(identity,newMainAppFrame()); new SeasonPlanWorker(parent, newSeason, view).execute(); // der worker berechnet für ne teamliste einen saisonspielplan. [...] } // hier der code aus dem worker public class SeasonPlanWorker extends SwingWorker<Void, Void> { private Season season; private ProgressView view; private final TableManagerDialog diag; public SeasonPlanWorker(TableManagerDialog main, Season s, ProgressView view) { super(); this.season = s; this.view = view; this.diag = main; } @Override protected Void doInBackground() throws Exception { view.setVisible(true); // die arbeit beginnt: ladefenster wird angezeigt SeasonPlanner.createPlan(season); return null; } @Override protected void done() { System.out.println("Ende"); // überprüft: wird ausgeführt System.out.println( SwingUtilities.isEventDispatchThread() ); // wie erwartet true view.taskEnded(); // enthält nur die sichtbarmachung des labels "Beendet" [...] // <-- enthält nur einen try-catch-block, der den thread 1 sekunde anhält, damit man das erschienene label noch ne sekunde sieht. diag.setVisible(false); // dann wird der dialog unsichtbar gemacht, mit ihm auch das ladefenster } } ich hoffe, das hilft, danke für die mühe... Bearbeitet 29. Juli 2009 von danvan Zitieren
perdian Geschrieben 29. Juli 2009 Geschrieben 29. Juli 2009 Ich würde nie bei einem JLabel setVisible aufrufen... setText() sollte vollkommen ausreichen. Zitieren
danvan Geschrieben 29. Juli 2009 Autor Geschrieben 29. Juli 2009 ok, danke. Darf ich den Grund erfahrren, nützt ja nichts, die Erkenntnis einfach auswendig zu lernen ich probiere es mal damit... Zitieren
perdian Geschrieben 30. Juli 2009 Geschrieben 30. Juli 2009 Darf ich den Grund erfahrrenKann ich aus dem Bauch nicht erklären, findet sich aber bestimmt beim Studium hier: http://java.sun.com/docs/books/tutorial/uiswing/ Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.