Question

J'ai 3 objets qui se prolongent JFrame nous allons les appeler FrameA FrameB FrameC.

FrameA est ma fenêtre principale de l'application. Du constructeur de FrameA si l'application n'est pas enregistré je crée FrameB et FrameC. Ils sont tout simplement de pop-up qui indiquent une période d'essai.

2 fois sur 10 application se bloque et ne montre jamais le cadre B et C anc cadre A ne répond plus.

Je me demandais s'il y a un effet secondaire de créer des cadres de cette façon?

Était-ce utile?

La solution

C'est parce que vous ne pas laisser la finition FRAMEA il est processus de construction, vous êtes interrompre puis dans le même fil affichant ces deux autres cadres.

Je suggère de modifier votre stratégie et utiliser une méthode de fabrication et probablement en conjonction avec la méthode SwingUtilities.invokeLater.

Disons que vous avez quelque chose comme:

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

Changer pour:

 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();  

      }
 }

Rien ne vous venez d'ajouter changé la méthode d'usine, plus tard, vous pouvez:

         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();
           }  

      }

Qu'est-ce que vous allez faire dans le second code est séparé de la logique du constructeur de la classe et le mettre dans la méthode de l'usine. De cette façon, si thatSpecialLogicSaysItIsTrialAndShouldPopUp renvoie true, vous affichez B et C

Vous pouvez également utiliser décrit un JDialog là, mais à peu près les problèmes disparaîtront lorsque vous vous séparez les responsabilités.

Autres conseils

Les symptômes que vous décrivez ressemble à quelque chose est verrouillage le fil des événements - ce qui peut ou ne peut pas avoir quelque chose à voir avec la façon dont vous lancez les cadres - vous voulez exécuter dans un débogueur et quand il commence présentant les symptômes vérifier l'état du thread d'événement.

(Bien que je suis d'accord avec tout le monde dans le fil que vous devez tirer la logique de lancer cadre à un autre endroit - mais - il n'y a rien « dangereux » à appeler les constructeurs de châssis d'un autre constructeur de châssis - ils ne sont pas différents de tout autre constructeur il peut être une mauvaise conception -.. mais il ne doit pas bloquer le fil de l'événement)

Votre va vouloir utiliser un JDialog. Il fait faire cette chose exacte.

Vous devriez penser à votre logique. Création de nouveaux cadres dans le constructeur d'un autre cadre semble étrange. Si vous le faire dans le constructeur - ce qui signifie que le premier cadre est pas encore montré. Pourquoi ne montrez-vous pas encadrez vous B et C en dehors du cadre Un constructeur - logiquement, il semble être le même. Mais en fonction de vos conditions, vous pouvez créer un cadre et définir visible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top