2009-06-26 6 views
0

Hintergrundinformation:Swing: Wie kann ich JInternalFrame gleichwertig mit anderen Komponenten in einem Container behandeln?

ich einen visuellen Diagramm-Editor bin die Umsetzung, die

besteht aus
  • verschiedenen komplexen Elementen (Wieder ansehnlicher, mit Titelleiste, Unterelemente) und
  • verschiedenen einfacher Elemente (nicht veränderbar, keine Titelleiste, keine Unterelemente).

Alle Elemente sind ziehbar.

Ich verwende JInternalFrame (für komplexe Elemente) zusammen mit JPanel (für einfache Elemente), um Elemente einer schematischen Darstellung darzustellen. Es gibt einen Container (entweder ein JDesktopPane oder ein JLayeredPane), die alle diese Elemente enthalten.

Ich habe mehrere Probleme mit diesem Konzept:

Fall 1 - Der Behälter ein JDesktopPane ist:

  • JInternalFrames sind immer über andere Elemente.
  • Klicken auf andere Elemente nicht "deaktivieren" vorher aktiv JInternalFrame

Fall 2 - Der Behälter ein JLayeredPane ist:

  • Nachdem einige Elemente in einem JInternalFrame klicken, es bleibt "für immer aktiviert".

Fall 3 - JInternalFrame für alles verwendet, aber ohne Dekoration für einfache Elemente:

  • Meine benutzerdefinierten Rahmen (die benötigt wird, wenn ich JInternalFrame Titelleiste manuell entfernen) ist jedes Mal ersetzt durch den aktuellen LAF-Rahmen, nach Aktivieren/Deaktivieren des JInternalFrame.

Ich bekomme nicht die ganzen Konzepte hinter Aktivierung von JInternalFrames sowieso. Wenn ich ein JInternalFrame nicht an allen aktivierbare machen könnte, könnte ich wählen Fall 2 jeder wäre glücklich.

Bitte geben Sie mir, was eine einfache und unkomplizierte Lösung gegeben Probleme wäre.

HINWEIS: Auswahl der Komponenten und Aktivierung von JInternalFrame scheinen verschiedene Dinge zu sein.

Antwort

0

Ich könnte Ihr Problem falsch verstehen. Haben Sie versucht, die Methode setSelected() von JIF zu betrachten? Es scheint, es gibt Unterstützung für Methodenüberschreibung und vetoable Aktivierungsereignisse.

Edit: Vielleicht haben wir einiges begriffliches Missverständnis, wie die javadoc Staaten:

/** 
* Selects or deselects the internal frame 
* if it's showing. 
* A <code>JInternalFrame</code> normally draws its title bar 
* differently if it is 
* the selected frame, which indicates to the user that this 
* internal frame has the focus. 
* When this method changes the state of the internal frame 
* from deselected to selected, it fires an 
* <code>InternalFrameEvent.INTERNAL_FRAME_ACTIVATED</code> event. 
* If the change is from selected to deselected, 
* an <code>InternalFrameEvent.INTERNAL_FRAME_DEACTIVATED</code> event 
* is fired. 
* 
* @param selected a boolean, where <code>true</code> means this internal frame 
*     should become selected (currently active) 
*     and <code>false</code> means it should become deselected 
* @exception PropertyVetoException when the attempt to set the 
*   property is vetoed by the <code>JInternalFrame</code> 
* 
* @see #isShowing 
* @see InternalFrameEvent#INTERNAL_FRAME_ACTIVATED 
* @see InternalFrameEvent#INTERNAL_FRAME_DEACTIVATED 
* 
* @beaninfo 
*  constrained: true 
*   bound: true 
*  description: Indicates whether this internal frame is currently 
*     the active frame. 
*/ 

Edit 2: Jetzt habe ich Ihren zweiten Fall wieder lesen. Ich würde sagen, jeder JIF hat seine eigene getrennte Fokus-/Auswahlumgebung. Sie könnten eine Methode erstellen, die alle Ihre JIFs durchquert und alle anderen Elemente deaktiviert, außer wenn Sie die Komponente ausgewählt haben, die Sie auswählen möchten.

+0

Ja, aber es hilft nicht. Auswahl hat nicht mit der Aktivierung von JInternalFrame zu tun. –

+0

Sie sehen, selbst im Javadoc ist es verwirrend. Sie sprechen über die Auswahl, aber die Eigenschaft heißt "aktiviert". Hinweis: Es gibt auch eine Eigenschaft "selected" (was für mein Problem nicht zutrifft). Hmmm, ich bin verwirrt ... –

+0

Ich verstehe es nicht. Jetzt habe ich InternalFrameListener und FocusListener zu allen JIFs hinzugefügt, aber keine dieser Listener empfängt irgendwelche Ereignisse! –

0

geben diesem einen Versuch, wenn Sie Ihre JInternalFrame initialisieren =

new JInternalFrame(<your args>) { 
      protected void fireInternalFrameEvent(int id){ 
       if (id != InternalFrameEvent.INTERNAL_FRAME_ACTIVATED) { 
        super.fireInternalFrameEvent(id); 
       } 
      } 
}; 

beachten Sie, dass in JInternalFrame.setSelected(boolean), setSelected und ‚actvation‘ sind miteinander verbunden, in Prozess Blick auf den Code, dass setSelected Brände nicht nur Eigenschaftsänderungen für Auswahl, ruft aber auch fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED) auf.

Verwandte Themen