2011-06-03 2 views
0

Je veux créer un JDialog qui ne peut que flotter dans son cadre parent. C'est-à-dire qu'il ne peut pas être retiré de son cadre parent. Une idée? écouteur de souris-mouvement?comment créer un JDialog qui ne peut que flotter dans son cadre parent

grâce,

EDIT:

  1. Mon applicaiton est basé sur le cadre non cadre interne, donc je ne peux pas utiliser JInternalFrame
  2. je besoin d'un dialogue non modale, je ne peux pas utiliser JOptionPane avec fonction interne.

Répondre

0

Ok, vous auriez dû spécifier le problème "caché" dans la question initiale.

J'ai trouvé une solution très délicate, je ne suggère pas de l'utiliser, sauf de développer un meilleur, peut-être à partir de cela. Étant donné un JInternalFrame, fournissez-lui un écouteur componentMove pour empêcher son déplacement dans des positions cachées. Pour autant que je l'ai testé, il a des problèmes de rafraîchissement (peut-être qu'ils peuvent être résolus) et la stabilité dans les cas extrêmes à évaluer aussi. fourni « tel quel » d'améliorer encore, non pas comme un beau morceau de logiciel :-)

public void componentMoved(ComponentEvent e) { 

       Rectangle r = new Rectangle(); 

       MyInternalFrame mif = MyInternalFrame.this; 
       JDesktopPane dp = mif.getDesktopPane(); 

       if (mif.getX() + mif.getWidth()> dp.getWidth()) { 
        mif.setLocation(mif.getDesktopPane().getWidth()-mif.getWidth(),mif.getY()); 
       } 

       if (mif.getY() + mif.getHeight()> dp.getHeight()) { 
        mif.setLocation(mif.getX(), mif.getDesktopPane().getHeight()-mif.getHeight()); 
       } 

       if (mif.getX()<0) { 
        mif.setLocation(0, mif.getY()); 
       } 

       if (mif.getY()<0) { 
        mif.setLocation(mif.getX(), 0); 
       } 

      } 

     }); 
4

Utilisez plutôt JInternalFrame. Voir this page pour un exemple.

+0

Oui, mais le InternalFrame peut être totalement caché sur le bord de son cadre parent. Un moyen d'éviter cela? Je ne veux pas que le cadre interne ou le dialogue flottant soit partiel ou totalement caché par son cadre parent. Cela signifie que la bordure gauche du cadre interne ou de la boîte de dialogue ne peut pas dépasser la bordure gauche de son cadre parent. – 5YrsLaterDBA

+0

@ 5YrsLaterDBA: Voir les méthodes incluant la chaîne 'internal' dans [JOptionPane] (http://download.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.html). –

+0

S'il vous plaît voir la modification ci-dessus. Je ne peux pas utiliser JOptionPane parce que j'ai besoin d'une boîte de dialogue non-modale pour afficher certaines données reçues. – 5YrsLaterDBA

Questions connexes