Swing Focus nach Beendigung eines Modal-JDialogs

CeJay

Mitglied
Hallo,

ich plage mich mit folgendem Problem:
Ich habe einen JDialog mit einem Knopf (StartFenster). Bei Aktivierung soll ein neues Fenster2 erzeugt werden. Weil das etwas dauern kann, möchte ich diesen Vorgang mit einer ProgressBar überwachen, der in einem modalen JDialog (Fortschrittsfenster) angezeigt wird.

Nun das Problem. Verwende ich jre1.6.0_17, dann ist der Fokus nach Schließen des Fortschrittsfensters auf dem StartFenster. Das neu erzeugte Fenster2 liegt dahinter.

Verwende ich jre1.6.0, dann klappt es und das Fenster2 liegt oben auf und hat den Fokus.

Ich vermute mal, dass ich irgendwas Im Zusammenhang mit Swing und Threads nicht verstanden habe... Vielleicht kann mir da jemand auf die Sprünge helfen?

Hier der vereinfachte Code StartFenster:
Java:
public class Fenster extends JDialog implements ActionListener {
   private JButton knopf;
   private JPanel rahmen;
   public Fenster(String title){
      super();
      setTitle(title);
      knopf=new JButton("Do it!");
      knopf.setBounds(10, 10, 80, 20);
      knopf.addActionListener(this);
      rahmen= new JPanel();
      rahmen.add(knopf);
      this.setBounds(50, 50, 350, 150);
      this.add(rahmen);
      this.setVisible(true);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      Thread job = new Thread(){
         public void run(){
            Fortschrittsanzeige.max=10;
            for (int i = 0; i<10; i++){
               try {
                  sleep(500);
               } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
               }
               Fortschrittsanzeige.wert=i;   
            }
            new Fenster("Fenster2");
         }
      };
      new Fortschrittsanzeige(job,this);
   }  
}

Hier der Code meiner Fortschrittsanzeige:
Java:
public class Fortschrittsanzeige{
   
   public static Popup pop;
   public static JDialog rahmen;
   public static int max =0;
   public static int wert=0;

   private static Thread job_back;
   
   private JProgressBar progress;
   
   public Fortschrittsanzeige(final Thread job, final JDialog fenster){
         rahmen = new JDialog();
         rahmen.setTitle("Fortschritt");
         progress = new JProgressBar();
         System.out.println("Enter");
         job_back=job;
         job_back.start();
      if (max>0){
         progress.setMaximum(max);
         progress.setValue(wert);
         progress.setIndeterminate(false);
      } else {
         progress.setIndeterminate(true);
      }
      
      Thread checker = new Thread(){
         public void run(){
            while(job_back.getState()!=State.TERMINATED){
               if (max>0){
                  progress.setMaximum(max);
                  progress.setValue(wert);
                  progress.setIndeterminate(false);
               }
               
               try {
                  Thread.sleep(60);
               } catch (InterruptedException e) {
                  e.printStackTrace();
               }
            }
            rahmen.dispose();
         }
      };
      checker.start();      

      rahmen.add(progress);
      rahmen.setPreferredSize(fenster.getSize());
      rahmen.setBounds(fenster.getBounds());
      rahmen.setModal(true);
      rahmen.setVisible(true);
}
}
 

KrokoDiehl

Top Contributor
Swing-Objekten sollten immer in der AWT-EventQueue (EDT) modifizert werden. Dafür gibt es z.B.
Code:
SwingUtilities.invokeLater()
.

Ferner ist deine "Klasse" Fortschrittsanzeige ziemlich threadunfreundlich, weil sie viele statische Elemente hat.

Im ersten Schritt würde ich das Fortschrittsanzeige-Fenster mal völlig unstatisch machen und im Wartethread als lokales Objekt halten. Wenn du dort (im Wartethread) dann z.b. den Fortschritt aktualisieren willst, kannst du das im o.g.
Code:
invokeLater()
machen. Grob gesagt meine ich etws derartiges:

Java:
    public void actionPerformed(ActionEvent event) {
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                final int            max  = 10;
                final ProgressDialog prog = new ProgressDialog(Fenster.this, max);

                // Wartefenster anzeigen
                SwingUtilities.invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        prog.setVisible(true);
                    }
                });
                
                // Warten ...
                for (int i = 0; i < max; i++) {
                    try {
                        Thread.currentThread().sleep(500L);
                    }
                    catch (InterruptedException iExc) {
                        iExc.printStackTrace();
                        break; // schleife abbrechen
                    }
                    
                    // Fortschrittsbalken erhöhen
                    SwingUtilities.invokeAndWait(new Runnable() {
                        @Override
                        public void run() {
                            prog.setProgress( prog.getProgess()+1 );
                        }
                    });
                }
                
                // Wartefenster schließen und neues Fenster2 anzeigen
                SwingUtilities.invokeAndWait(new Runnable() {
                    @Override
                    public void run() {
                        prog.setVisible(false);
                        prog.dispose();
                        new Fenster("Fenster2");
                    }
                });
            } //run()
        };

        this.getDoItButton().setEnabled(false);
        new Thread(runnable, "Warte auf Fenster2").start();
    }
Der Code ist nun sicher ein Extremfall. Ich kann auch nicht garantieren dass damit dein Fokusproblem behoben wird. Sicher muss dur dir auch über das Parenting der Fenster (auch Fenster1 und Fenster2) Gedanken machen und die Hinweise von kay73 beachten.
In jedem Fall aber ist das ein besserer Umgang mit Thread(s) und dem EDT.
 

CeJay

Mitglied
Vielen Dank für die ausführliche Hilfe.

Ich seh da aber immer noch ein Problem. Ich möchte doch eigentlich den Fortschrittsbalken anzeigen, während das Fenster2 erzeugt wird und nicht vorher! Mein Problem ist doch, dass der Vorgang des Erzeugens von Fenster2 eine ganze Weile dauern kann und ich dafür den Fortschrittsbalken brauche.

Oder hab ich da wieder was falsch verstanden?

Im Grunde hätte ich gerne eine Klasse, der ich (in einem Thread?) eine Aufgabe übergeben kann und die mir anzeigt, wie weit die Aufgabe fortgeschritten und wann sie beendet ist.

Und diese Aufgabe kann z.B. darin bestehen, ein Fenster zu erzeugen.
 
Zuletzt bearbeitet:

KrokoDiehl

Top Contributor
Okay, du kannst natürlich das "new Fenster2()" dahin legen, wo du willst. Oder du nimmst einen SwingWorker, der ist vermutlich einfacher weil er die "process()"-Methode direkt im EDT ausführt. Das könnte etwa so aussehen:

Java:
public final class Fenster2Lader extends SwingWorker<Fenster2, String> {

    private final DialogMitProgresBar fortschritt;
    
    ...
    
    @Override
    protected Fenster2 doInBackground() throws Exception {
        this.publish("Lade Fenster...");
        Fenster2 fenster = new Fenster2();
        this.publish("Lade Gui...");
        fenster.initGui();
        this.publish("Lade Grafiken...");
        fenster.initImages();
        this.publish("Lade Daten...");
        fenster.initData();
        //...
        
        // fertig!
        SwingUtilities.invokeAndWait(new Runnable() {
            @Override
            public void run() {
                fortschritt.setVisible(false);
            }
        });
        return fenster;
    }
    
    @Override
    protected void process(List<String> chunks) {
        if ( ! chunks.isEmpty()) {
            fortschritt.setProgress(chunks.get( chunks.size()-1 ));
        }
        
        if ( ! fortschritt.isVisible()) {
            fortschritt.setVisible(true);
        }
    }
}

Eine andere Alternative ist auch der ProgressMonitor.
Ich hoffe beide Möglichkeiten helfen dir weiter.
 

CeJay

Mitglied
Servus,

ich hab jetzt schon einiges dazu gelernt und ausprobiert. An sich klappt das auch, aber das mit dem "Verlegen" von new Fenster2() vor "prog.dispose" bewirkt wiederum, dass mein neues Fenster nicht mehr im Vordergrund steht. Der modale Dialog in dem sich die PrograssBar befindet, blockiert offensichtlich.

Oder es stimmt wirklich etwas mit dem Parenting nicht...

Die andere Variante mit SwingWorker muss ich erst noch ausprobieren. Ich geb noch nicht auf.

Danke jedenfalls für die Unterstützung!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Focus nach Start eines externen Programmes Allgemeine Java-Themen 6
H Focus Gained nach Fensterwechsel Allgemeine Java-Themen 13
S KeyListener ohne Focus - Wie? Allgemeine Java-Themen 2
B Focus auf das Eingabefeld richten Allgemeine Java-Themen 4
P Listener für Tastatureingaben ohne Focus Allgemeine Java-Themen 4
D Focus und Status Allgemeine Java-Themen 2
H Fenster focus Allgemeine Java-Themen 5
ARadauer mit keylistener hören auch wenn frame nicht den focus hat Allgemeine Java-Themen 2
P Focus über einer JComponent Allgemeine Java-Themen 9
M Focus setzen - Frage zu FAQ Artikel Allgemeine Java-Themen 6
E focus problem (mit mehreren frames) Allgemeine Java-Themen 10
E Focus Problem Allgemeine Java-Themen 65
TheJavaKid Focus für KeyListener setzen Allgemeine Java-Themen 5
D WSDL-Aufruf funktioniert nicht mehr nach Umstieg auf Maven Allgemeine Java-Themen 4
Zrebna Tipps für Organisation von Code-Reviews nach einem Pull Request. Allgemeine Java-Themen 5
Ernesto95 HTTP Mit JavaScript erzeugte dynamische Webseite auslesen und nach einem Schlüsselwort durchsuchen Allgemeine Java-Themen 6
D Image bewegt sich nicht nach Klicken auf Button Allgemeine Java-Themen 15
I 2D-Grafik Vektor-Grafik über die Zwischenablage nach Adobe Illustrator transferieren Allgemeine Java-Themen 8
M Suche nach String mit unbekannten characters Allgemeine Java-Themen 53
L 2 Dimensionale ListArray Abfrage nach einem Wert suchen Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
OnDemand Ram Freigabe erfolgt nicht nach Prozessende Allgemeine Java-Themen 18
G Geotools Probleme nach PC-Wechsel Allgemeine Java-Themen 6
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
E Variablen Nach Übergabe einer Variable den Constructor aufrufen Allgemeine Java-Themen 16
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
M TicTacToe Sound nach jedem Zug Allgemeine Java-Themen 21
I HTML / XHTML Seite nach Excel exportieren. Suche Lib Allgemeine Java-Themen 12
J4n5chmiddi Methoden Website-URL im Browser öffnen nach erfolgreicher Basisauthentifizierung in Java Allgemeine Java-Themen 12
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
Monokuma String List nach Zahlen und Worten sortieren Allgemeine Java-Themen 9
H Collections Aktuellen Index generell und nach Sortierung ausgeben Allgemeine Java-Themen 6
Kirby.exe Filename nach bestimmtem Pattern durchsuchen Allgemeine Java-Themen 5
S Wörterliste nach Wörtern mit u durchsuchen und diese auf der Konsole ausgeben lassen Allgemeine Java-Themen 33
W Pdf verwerfen, weil Checkbox nach Unterschrift geaendert wurde Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
S Swing Speichern nach Button-Klick Allgemeine Java-Themen 5
Meeresgott Effizientester Weg um nach der Value einer verschachtelten Map aufzulösen Allgemeine Java-Themen 5
M Java 8 nach Java 6 konvertieren Allgemeine Java-Themen 7
N Neustarten des Codes nach der Fehlermeldung Allgemeine Java-Themen 17
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
F Java Code ausführen direkt nach Anmelden in Windows Allgemeine Java-Themen 2
J Jasper Reports - Compilerproblem nach Umstellung von Groovy auf Java Allgemeine Java-Themen 7
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
S Apache POI Filtern nach bestimmten Kriterium Allgemeine Java-Themen 1
L Korrektur nach der Berechnung vornehmen, aber wie? Allgemeine Java-Themen 11
C Config nach bestimmten Wertdurchsuchen. Allgemeine Java-Themen 2
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
B Maven Keycloak library wirft exceptions nach maven package Allgemeine Java-Themen 1
D BufferedReader bricht nach 1248 Iterationen ab Allgemeine Java-Themen 14
G Eclipse Java findet MySQL Driver nach export nicht mehr Allgemeine Java-Themen 2
H IDEA IntelliJ Java Mail funktioniert nach Export nicht mehr! Allgemeine Java-Themen 1
F Zurnung nach Buchstaben und deren Prüfung Allgemeine Java-Themen 9
M Dateien nach kopieren vergleichen Allgemeine Java-Themen 9
MiMa Sortieren nach Stellenangaben Allgemeine Java-Themen 7
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
J Ausgabe von Links nach Rechts ausgeben? Allgemeine Java-Themen 2
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
The Pi 2D-Grafik Tic Tac Toe nach Gewinn rot Allgemeine Java-Themen 1
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
C PDFBox: Nach RegEx ganze Zeile Allgemeine Java-Themen 4
R javax.comm --> Programm funktioniert nach Export nicht mehr Allgemeine Java-Themen 0
L Suche nach CalDav Server API Allgemeine Java-Themen 0
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
T Textarea nach nur 1 wort durchsuchen Allgemeine Java-Themen 3
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
I nach Image Load in ListView, kann Ordner nicht mehr gelöscht werden Allgemeine Java-Themen 1
K Auf einer Website nach einem String suchen Allgemeine Java-Themen 5
C Eclipse OutOfMemory nach dem exportieren Allgemeine Java-Themen 4
D Erste Schritte Array von einer forschleife nach ausserhalb trasferieren Allgemeine Java-Themen 3
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
heyluigi Random Integer Array Ausgabe nach Größe sortieren Allgemeine Java-Themen 6
D Java Datei nach Eclipse Export funktioniert nicht Allgemeine Java-Themen 0
B Bild aus Jar kann nach Export nicht mehr gefunden werden Allgemeine Java-Themen 13
B Umgebungsvariable Anpassen der Umgebungsvariablen nach Java-Update ? Allgemeine Java-Themen 14
H jid3lib nach schreiben keine Tags im Folder angezeigt Allgemeine Java-Themen 1
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
KilledByCheese Dezimal nach Hexadezimal rechner wirft seltsame exception Allgemeine Java-Themen 4
J Programm meldet "Keine Rückmeldung" nach Verbindung zum Server Allgemeine Java-Themen 4
E Java wird beendet nach paar Sekunden Allgemeine Java-Themen 14
H Best Practice setHeader in jsp nach RequestDispatcher.include Allgemeine Java-Themen 0
L Nach Button drücken den Text festspeichern Allgemeine Java-Themen 9
M .jar nach Datei prüfen Allgemeine Java-Themen 2
F String nach Schlüsselwörtern durchsuchen und ganze Zeile ausgeben Allgemeine Java-Themen 4
HarleyDavidson Input/Output Heruntergeladene Datei direkt nach dem Download öffnen ohne zu speichern Allgemeine Java-Themen 1
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
VfL_Freak JDK installieren Problem mit Erstellungspfad nach Wechsel von Java7 auf Java8 Allgemeine Java-Themen 1
B Eclipse Nach Export einer .jar Fehler: Hauptklasse konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 5
thet1983 nach teilen eines Dateinamens suchen Allgemeine Java-Themen 6
F JLabel nach 5 Sekunden wieder leeren Allgemeine Java-Themen 7
M Fasta nach Mustern durchsuchen dauert zu lange Allgemeine Java-Themen 2
J Bilder halb in falscher Farbe nach kopieren aus Web Allgemeine Java-Themen 3
Thallius Neuen Prozess starten, der auch nach Beedingung des Starter-Prozesses weiterläuft? Allgemeine Java-Themen 5
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
A Funktionen aufrufen nach Schema x Allgemeine Java-Themen 2
G JavaFX Problem nach Update auf Java 8 Allgemeine Java-Themen 0

Ähnliche Java Themen


Oben