/ / Swing: Wie kann ich JInternalFrame mit anderen Komponenten in einem Container gleich behandeln? - Java, Benutzeroberfläche, Swing, jinternalframe, jdesktoppane

Swing: Wie kann ich JInternalFrame mit anderen Komponenten in einem Container gleich behandeln? - Java, Benutzeroberfläche, Swing, jinternalframe, jdesktoppane

Hintergrundinformation:

Ich implementiere einen visuellen Diagrammeditor, der aus besteht

  • verschiedene komplexe Elemente (in der Größe veränderbar, mit Titelleiste, Unterelementen) und
  • verschiedene einfache Elemente (nicht veränderbar, keine Titelleiste, keine Unterelemente).

Alle Elemente sind ziehbar.

Ich benutze JInternalFrame (für komplexe Elemente)zusammen mit JPanel (für einfache Elemente) zur Darstellung von Elementen eines Schaltplans. Es gibt einen Container (entweder ein JDesktopPane oder ein JLayeredPane), der enthält all diese Elemente.

Ich habe mehrere Probleme mit diesem Konzept:

Fall 1 - Der Container ist ein JDesktopPane:

  • JInternalFrames stehen immer über anderen Elementen.
  • Wenn Sie auf andere Elemente klicken, wird der zuvor aktive JInternalFrame nicht deaktiviert

Fall 2 - Der Container ist ein JLayeredPane:

  • Nach dem Klicken auf einige Elemente in einem JInternalFrame bleibt dieser bestehen für immer "aktiviert".

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

  • Meine benutzerdefinierte Grenze (was benötigt wird, wenn ich manuell entferne Titelleiste von JInternalFrame) wird jedes mal durch die aktuelle LAF-Grenze ersetzt, danach JInternalFrame aktivieren / deaktivieren.

Ich verstehe ohnehin nicht alle Konzepte, die hinter der Aktivierung von JInternalFrames stehen. Wenn ich einen JInternalFrame überhaupt nicht aktivierbar machen könnteIch könnte wählen Fall 2 jeder würde sich freuen.

Bitte raten Sie mir, was eine einfache und unkomplizierte Lösung für gegebene Probleme wäre.

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

Antworten:

0 für die Antwort № 1

Ich könnte Ihr Problem falsch verstehen. Haben Sie versucht, sich die setSelected () -Methode von JIF anzusehen? Es scheint, dass Methodenüberschreibungen und Aktivierungsereignisse mit Veto unterstützt werden.

Bearbeiten: Vielleicht haben wir ein terminologisches Missverständnis, wie der Javadoc feststellt:

/**
* 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.
*/

Bearbeiten 2: Jetzt habe ich Ihren zweiten Fall noch einmal gelesen. Ich würde sagen, dass jedes JIF eine eigene Fokus- / Auswahlumgebung hat. Sie können eine Methode erstellen, die alle Ihre JIFs durchläuft und die Auswahl aller darin enthaltenen Elemente aufhebt, es sei denn, es handelt sich um die Komponente, die Sie auswählen möchten.


0 für die Antwort № 2

Probieren Sie es aus, wenn Sie JInternalFrame = initialisieren

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

Beachten Sie, dass Sie sich den Code in ansehen JInternalFrame.setSelected(boolean), setSelected und "actvation" sind dabei miteinander verbunden, dass setSelected nicht nur Eigenschaftsänderungen für Selection auslöst, sondern auch Aufrufe fireInternalFrameEvent(InternalFrameEvent.INTERNAL_FRAME_ACTIVATED) auch.