Verhindert, dass JInternalFrame aus einem JDesktopPane verschoben wird

8

Wenn ich einen JInternalFrame in einem JDesktopPane habe, ist der JInternalFrame beweglich (was gut ist). Es ist jedoch möglich, es außerhalb des sichtbaren Bereichs des JDesktopPane zu verschieben (was ich nicht so mag)

Um selbst zu sehen, hier ist ein Beispielcode:

%Vor%

Ist es möglich, JInternalFrame oder JDesktopPane so zu setzen, dass sie dies nicht zulassen?

    
amaidment 15.11.2011, 13:19
quelle

4 Antworten

8

Der Mitarbeiter, der für die Verschiebung / Größenänderung zuständig ist, ist der DesktopPaneManager. Also würde ich versuchen, die Bewegung auf den Bereich zu beschränken. Hier ist eine schnelle & amp; schmutziger Beweis des Konzeptes:

%Vor%

Es gibt einige Probleme zu lösen, offensichtlich :-) F.i.

  • Verwenden Sie den Manager für den LAF, indem Sie einen Wrapper DesktopManager implementieren, der alles andere an den installierten LAF delegiert
  • Suche nach Nebenwirkungen (der Widerstand scheint nicht mehr zu reagieren, nachdem er eine Wand getroffen hat, es könnten andere Dinge nötig sein)

Bearbeiten

nur zur Verdeutlichung: Mit "nicht reagierend" meine ich, dass der Benutzer die Maustaste loslassen und erneut drücken / ziehen muss (sobald der interne Frame die Grenzen des Desktops erreicht hat), um die Position weiter zu verschieben. Das ist nicht allzu überraschend, da der BorderListener (das ist der von BasicInternalFrame installierte mouseListener) einige Zustände im Zusammenhang mit dem ersten Drücken behält und Anfragen dann relativ zu diesem ursprünglichen Ort neu lokalisiert werden. Ziehen Sie die Maus mit dem Rahmen fest irgendwo verwirrt diesen internen Zustand.

Interessanterweise scheint es bei dem Blick auf den Code die Absicht zu geben, die Bewegung zu begrenzen, um sie nicht nach außen zu schieben,

%Vor%

ist jedoch relativ zur aktuellen Mausposition.

    
kleopatra 15.11.2011, 15:42
quelle
8

Volle Anerkennung für kleopatra, dass er mich in die richtige Richtung weist.

Ich denke, ich habe das Problem der Nicht-Reaktion gelöst und teile meine Lösung hier. Wenn der Mauspunkt außerhalb des Bereichs liegt, befindet sich der interne Rahmen nach der Kleopatra-Antwort am Rand des Bereichs. Auch dies folgt weiterhin der Maus - dh wenn Sie die Maus vom unteren Rand des Fensters bewegen und dann auf die rechte Seite des Fensters umrunden, folgt der Rahmen am unteren Rand des Fensters und dann auf der rechten Seite Sand der Scheibe.

%Vor%     
amaidment 16.11.2011 12:11
quelle
0

Versuchen Sie FlowLayout von JFrame festzulegen und verwenden Sie die Methode " add() ", um JDesktopPane hinzuzufügen.

%Vor%     
adatapost 15.11.2011 13:29
quelle
0

Es ist wichtig, dass der obere Teil des JInternalFrames nicht ausgeblendet wird, da sich dort die Griffleiste und die Steuerschaltflächen befinden. Stellen Sie als letzten Schritt vor dem Festlegen von Grenzen sicher, dass Ihr y-Wert nicht negativ ist, beispielsweise mit einer Anweisung wie y = Math.max (0, y).

    
Mike Lampton 26.08.2015 00:00
quelle