2010-06-14 4 views
1

J'essaie de créer un JFrame (enfant) qui glisse sous un côté d'un second JFrame (parent). Le but est alors d'amener l'enfant à suivre le parent lorsqu'il est déplacé et de répondre aux événements de redimensionnement. Ceci est en quelque sorte lié à ce question. J'ai essayé d'utiliser un ComponentListener, mais avec cette méthode, l'enfant ne bouge qu'une fois que le parent s'est arrêté, alors que je voudrais que l'enfant bouge quand le parent est traîné sur l'écran. Une autre option que j'ai essayé était de démarrer un nouveau thread de mise à jour qui continuellement mis à jour l'emplacement de l'enfant en utilisant getLocation() ou getLocationOnScreen(), mais le retard était le même que celui de ComponentListener.Obtenir l'emplacement actuel d'un JFrame

Existe-t-il un moyen d'obtenir l'emplacement réel réel d'un JFrame même au milieu d'un glisser? ou sinon, y a-t-il un moyen d'obtenir l'effet d'une feuille qui glisse par-dessous et qui suit le Cadre?

+1

Je reçois des événements componentMoved tout en faisant glisser un cadre (sur Vista). Quel OS/JRE utilisez-vous? – Ash

+0

mac os 10.4.11 avec java 1.5.0_19 –

+0

D'accord, c'est probablement la différence OS. Je viens de jeter ensemble une petite application avec un cadre "suiveur" connecté via ComponentListener à un cadre principal et cela fonctionne bien tout en faisant glisser. – Ash

Répondre

0

Vous devez utiliser la méthode mouseDragged (MouseEvent e) de la classe MouseAdapter. Lorsque vous faites glisser votre fenêtre principale, vous obtiendrez plusieurs de ces événements mouseDragged - gérez chacun d'eux en déplaçant la seconde fenêtre vers une position relative à l'emplacement de la fenêtre principale. Si vous voyez 'lag' ou si elle ne se repositionne pas jusqu'à ce que la fenêtre principale s'arrête, essayez de forcer Swing à repeindre en appelant repaint() sur la deuxième fenêtre après repositionnement et/ou en mettant votre code de repositionnement dans un SwingUtilities .invokeLater (...) bloc:

Faites-moi savoir si cela aide.

0

Si cela ne fonctionne pas sur Mac, vous pouvez également stocker la position initiale lorsque le glissement commence, puis l'emplacement de la fenêtre est initialPosition + mouvement de la souris.

+0

Pourriez-vous être un peu plus précis sur la façon d'obtenir la position initiale et comprendre quand la traînée s'arrête? –

Questions connexes