2009-05-19 1 views
2

Kann ich einen Zuhörer (sagen wir MouseAdapter) zu einer Swing-Komponente hinzufügen und alle Innendekorationskomponenten?Swing: Hinzufügen von Listener zu einer Komponente und ALL ihre Dekoration?

So dass, wenn ein JInternalFrame mit der Maus (durch Ziehen der Titelleiste des Fensters) bewegt wird, würde es geben Sie mir folgende Ereignisse:

  • mouse Ereignis,
  • mouseDragged Ereignis,
  • mouseReleased Ereignis.

Derzeit erhalte ich keine der oben genannten Ereignisse, wenn JInternalFrame ziehen.

Ich hoffe, es gibt eine standardisierte Lösung, aber ich konnte keine finden.

EDIT:
Einige Leute vorschlagen, mit ComponentListener, aber das wäre für mich nicht. Ich muss wissen, Wenn der Benutzer stoppt, ziehen (mouseReleasedEvent), nicht, wenn die Komponente bewegt.

Antwort

0

Sie sollten wahrscheinlich eine MouseMotionListener anstelle einer MouseListener verwenden.

+0

Mouseadapter implementiert beide, und ich füge hinzu es addMouseListener mit (...) und addMouseMotionListener (...) –

0

Im JInternalFrame API documentation, heißt es:

Im Allgemeinen Sie JInternalFrames zu ein JDesktopPane hinzuzufügen. Die Benutzeroberfläche delegiert die Look-and-Feel-spezifischen Aktionen an das DesktopManager-Objekt , das von JDesktopPane verwaltet wird.

Vielleicht sollten Sie Ihren Listener zum JDesktopPane hinzufügen.

0

MouseListener/MouseMotionListener wird beim Ziehen eines JInternalFrame nicht erkannt. Die beste Methode, um Bewegungen zu erkennen, ist die Verwendung eines ComponentListener auf dem JInternalFrame.

+0

Die ComponentListener löst das Ereignis „componentMoved“, aber ich muss wissen, wann der Benutzer beginnen und den Ziehvorgang beenden . Der Benutzer könnte die Maustaste gedrückt lassen, aber die Komponente nicht verschieben. ComponentListener würde mir nicht sagen, dass die Maustaste noch gedrückt wird. –

+0

Ich weiß das, aber nicht ganz sicher, wie du das schaffen würdest, also war das das Beste, was ich tun konnte. Aus Neugier, warum musst du das wissen? – willcodejavaforfood

2

Ja, Sie können allen Komponenten eines Containers einen Listener hinzufügen. getComponents und fügen Sie den Listener hinzu. Sie sollten es schaffen, dies rekursiv zu tun. Sie können auch ContainerListener verwenden, um zu prüfen, ob Komponenten hinzugefügt oder entfernt werden.

Allerdings verhalten sich MouseListener und MouseMotionListener merkwürdig darin, dass das Ereignis normalerweise bis zum Elternteil aufbläht, tut dies aber nicht, wenn ein Zuhörer anwesend ist (wie ist das für hoffnungsloses Design?).

Zur Auswahl stehen:

  • Recursively Zugabe von Hörern (schlecht, siehe oben)
  • Hinzufügen von Hörern zu spezifischen Komponenten (zerbrechlich)
  • eine "Glasscheibe" (ein unordentlich Hack)
  • Hinzufügen
  • Eine AWTEventListener zu Toolkit hinzufügen (erfordert Berechtigungen)
  • Pushing ein EventQueue und Überprüfung durch Ereignisse (funktioniert nicht von Opera und Safari anscheinend; stoppt System Copy-and-Paste und Applet Ziehen von der Arbeit)
  • Verwenden Sie ComponentListener?
+0

Versucht: Glasscheibe erhält keine notwendigen Ereignisse. Ich denke ich schreibe eine eigene ziehbare Komponente (schon einmal gemacht) –

+0

Eine Glasscheibe auf dem Inhaltsbereich des internen Rahmens wird (offensichtlich) nicht funktionieren. –

+0

Ah, Entschuldigung, du meinst Glasscheibe des Elternteils von JInternalFrame. Warum ist es ein chaotischer Hack? –

1

fand ich heraus, wie es konnte getan werden, aber etwas sagt mir, es ist ein schmutziger Hack;)

Nun, es funktioniert, aber wer kann mir die Garantie geben, dass es funktioniert überall?

// ctor goes here { 

InternalFrameUI thisUI = getUI(); 
((BasicInternalFrameUI) thisUI).getNorthPane() 
    .addMouseMotionListener(new MyMouseListener()); 

// } 

NorthPane stellt sich heraus, die Titelleiste des Fensters zu sein.

Verwandte Themen