2009-11-15 3 views
0

J'ai une application qui ouvre plusieurs JIF, mais je veux seulement créer une seule instance du JIF, donc j'utilise ces fonctions pour vérifier cela, et j'utilise disposer pour fermer le JIF après qu'une touche est pressée (JDesktopPane.getSelectedFrame().disposer()). Cependant après 2-3 éliminations successives, il ne crée pas un nouveau JIF? Est-ce que je fais quelque chose de mal ici?Gestion d'une seule instance de JInternalFrame?

public static void setInternalFrame(final JInternalFrame internalFrame) { 
    log.debug("CurActiveInternalFrame " + ShoppyPOSApp.getCurrentActiveInternalFrame(), null); 
    log.debug("Incoming internalFrame " + internalFrame, null); 

    boolean isFrameFound = false; 
    try { 
     // Have a check whether the DesktopPane contains the internal Frame 
     // If yes bring it to front and set the focus 
     for (int i = 0; i < ShoppyPOSApp.frame.mainDesktopPane.getAllFrames().length; i++) { 
      if (ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i].getClass() == internalFrame.getClass()) { 
       isFrameFound = true; 
      } 
     } 

     if (!isFrameFound) { 
      internalFrame.setVisible(true); 
      internalFrame.setLocation(
       ShoppyPOSApp.frame.mainDesktopPane.getWidth()/ 2 - internalFrame.getWidth()/2, 
       ShoppyPOSApp.frame.mainDesktopPane.getHeight()/2 - internalFrame.getHeight()/2 
      ); 
      ShoppyPOSApp.frame.mainDesktopPane.add(internalFrame); 
     } 
     internalFrame.setSelected(true); 
    } catch (Exception e) { 
     log.debug(e.toString(), null); 
    } 
} 

Répondre

1

Vous comparez les classes de votre paramètre d'entrée et les images internes de votre ordinateur de bureau dans votre boucle for. Cela sera toujours vrai car votre paramètre est une instance de JInternalFrame et la méthode getAllFrames renvoie un tableau de JInternalFrames. Pourquoi ne pas faire une comparaison régulière? :

ShoppyPOSApp.frame.mainDesktopPane.getAllFrames()[i] == internalFrame 

Je vous conseille d'utiliser HIDE_ON_CLOSE comme default close operation sur les cadres et en utilisant setVisible(false) dans votre écouteur de touche au lieu de dispose(). Lorsque les images sont éliminées, elles sont fermées et vous ne devriez pas essayer de réutiliser une image après qu'elle a été fermée. Si vous masquez simplement le cadre, il sera toujours un enfant du panneau de bureau. Vous devez donc ajouter un appel à setVisible(true) lorsque vous trouvez un cadre dans votre méthode setInternalFrame.

Il semble que vous obtenez un comportement incohérent (vous dites qu'il échoue après deux ou trois dispose). Ceci suggère à moi que vous avez un problème de thread d'événement. Est-ce que votre setInternalFrame est appelée sur le thread d'événement? Connaissez-vous le Event Dispatch Thread et l'utilisez-vous correctement?

1

Je ne pense pas dispose est en train de faire ce que vous voulez dire pour ce faire. dispose se débarrasse du système d'exploitation "peer" de votre cadre. Mais si vous avez l'intention de montrer ce cadre à nouveau, alors vous ne devriez pas jeter ses fondements!

J'irais avec setVisible(false) sur le JIF pour le cacher. Ensuite, vous pouvez le réactiver avec setVisible(true).

Questions connexes