Frage

Ich habe 3-Objekte, die erweitern JFrame nennen wir sie FrameA FrameB FrameC.

FrameA ist mein Hauptfenster. Von FrameA Konstruktor, wenn die Anwendung nicht registriert ist, erstelle ich FrameB und FrameC. Sie werden Popup ist nur, dass Probezeit an.

2 mal von 10 Anwendung gefriert und zeigt nie den B anc C-Rahmen und den Rahmen A wird nicht mehr reagiert.

Ich frage mich, ob es ein Nebeneffekt der Schaffung Frames in dieser Art und Weise ist?

War es hilfreich?

Lösung

Das ist, weil Sie nicht Puls A-Finish werden lassen es Bauprozess ist, bist du es zu unterbrechen und dann im selben Thread die beiden anderen Frames anzeigen.

Ich würde vorschlagen, Ihre Strategie zu ändern und eine Factory-Methode verwenden und wahrscheinlich in Verbindung mit SwingUtilities.invokeLater Verfahren.

Lassen Sie uns sagen, Sie haben so etwas wie:

 public static void main( String [] args ) {
      JFrame a = new FrameA(); // Has both display logic and trial "pop up" logic
 }

Ändern Sie es für:

 public static void main( String [] args ) {
      JKFrame a = FrameA.createFrame(); // the same but splited like the following code 
 }


 class FrameA extends JFrame {
      // new method
      public static JFrame createFrame() {
            return new FrameA();  

      }
 }

Nichts geändert Sie nur die Factory-Methode hinzugefügt, später können Sie:

         public static JFrame createFrame() {
            if( thatSpecialLogicSaysItIsTrialAndShouldPopUp() ) {
                  JFrame b = new FrameB();
                  b.setVisible( true );
                  JFrame c = new FrameC();
                  c.setVisible( true );
                  return new FrameA();

           } else {
            return new FrameA();
           }  

      }

Was werden Sie in dem zweiten Code zu tun ist getrennt die Logik aus der Klasse Konstruktor und es in der Factory-Methode setzen. Auf diese Weise, wenn thatSpecialLogicSaysItIsTrialAndShouldPopUp true zurück, die Sie anzeigen B und C

Sie können auch, wie die Verwendung einer JDialog da, aber so ziemlich die Probleme verschwunden sein, wenn Sie die responsabilities trennen.

Andere Tipps

Die Symptome, die Sie beschreiben, klingt wie etwas, das Sperren der Veranstaltung Faden wieder auf - dies alles kann oder auch nicht haben zu tun, wie Sie die Rahmen sind gestartet - Sie werden in einem Debugger ausgeführt werden soll und wenn es beginnt, die Symptome aufweisen, überprüfen Sie auf dem Stand des Ereignis-Thread.

(Obwohl ich mit allen anderen im Thread zustimmen würde, dass Sie den Rahmen ziehen sollte Logik an einen anderen Ort starten - aber - es gibt nichts „unsicher“ zu nennen Rahmen Konstrukteuren von einem anderen Frame-Konstruktor - sie sind nicht anders als jeder andere Konstruktor es kann schlechtes Design sein -.. aber es sollte das Ereignis Thread nicht einsperren)

Ihr gehen zu wollen, einen JDialog zu verwenden. Dort machte genau dieses zu tun.

Sie sollten über Ihre Logik denken. Schaffung neuer Rahmen im Konstruktor eines anderen Rahmens klingt seltsam. Wenn Sie es im Konstruktor tun - das bedeutet, dass erstes Bild noch nicht angezeigt wird. Warum gehst du nicht Sie B und C Ein Konstruktor außerhalb des Rahmens Frame Show - logisch scheint es gleich zu sein. Aber dann je nach Bedingungen können Sie Frame-A erstellen und es sichtbar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top