Java: Wie zeichne nicht-scrollendes Overlay über ScrollPane Viewport?

8

Ich möchte ein ScrollPane verwenden, um ein Bild in seinem Ansichtsfenster anzuzeigen, und außerdem ein Raster (oder eine Box oder eine andere Art von Registrierungs- / Ortsmarkierung) über das Bild legen. Ich brauche das Overlay, um beim Scrollen fixiert zu bleiben (was bedeutet, dass sich das Bild unter dem Overlay zu bewegen scheint). Ich werde die Ansicht im Ansichtsfenster mit einer festen Rate scrollen, um eine reibungslose Bewegung zu ermöglichen, und die Überlagerung soll einen Verweis auf eine bestimmte Position innerhalb des Ansichtsfensters liefern. Stellen Sie sich konzeptionell eine große Karte vor, die in einem Ansichtsfenster scrollt, und das Ansichtsfenster mit einem Rechteck, das sich nicht bewegt (relativ zum Ansichtsfenster selbst), das eine Region markiert, auf der basierend auf einer Benutzeraktion gezoomt werden kann.

Ich nehme an (aber habe es noch nicht bestätigt), dass die ScrollPane-Implementierung das Rendering der Ansicht effizient abwickelt (aus dem Hintergrundspeicher, nicht die gesamte View (oder sogar ViewPort) für jede neue Teilbelichtung neu streichen muss) Die Methode paint () überschreiben zu müssen.

Ich habe LayerPane angeschaut, und obwohl ich es nicht gemeistert habe, scheint es sich um einen Brute-Force-Ansatz zu handeln. Der ScrollPane ist eine Komponente eines SplitPane und wird verschoben / skaliert. Ich erwarte, dass ich die korrekte Beziehung zwischen dem ViewPort und dem LayerPane mithilfe der absoluten Positionierung manuell beibehalten muss. Ich bin weit von einem Experten in GUI-Design & amp; Implementierung und ich bin mir sicher, dass ich die Möglichkeiten vermisse, die von offensichtlich bis dunkel und elegant reichen, die eine erfahrene Person kennen würde.

Ich bin offen für irgendwelche Vorschläge, nicht nur für den Weg, den ich begonnen habe. Sollte ich (kann ich) ein JPanel als eine Komponente in meinem SplitPane hinzufügen, dann ein LayerPane zu dem mit meinem ScrollPane und dem Overlay (ein anderes JPanel) auf verschiedenen Layern auf dem LayerPane hinzufügen? Gibt es in ScrollPane Funktionen, um dies direkt zu unterstützen? Ich habe mir die Java Swing-Tutorials und die API-Dokumentation angeschaut, aber noch nichts gesehen.

Danke.

UPDATE:

Danke für den Link, trashgod. Das war viel einfacher als ich erwartet hatte. Keine Notwendigkeit für LayerPane, GlassPane, xor-basierte Compositing ... Ich weiß nicht, warum es mir nicht eingefallen ist zu versuchen, JViewport.paint () zu überschreiben, um mein Overlay zu zeichnen - aber mit dem Code unten validierte ich das Konzept gib mir was ich suche. Verwenden Sie einfach die Unterklasse von JViewport und es tut was ich wollte (in diesem Fall überlagert ein Rechteck in der Mitte des Viewports, während das Bild darunter scrollt). Ich bin kein GUI-Experte und die Java-API ist unglaublich breit. Ich habe keine Ahnung, wie du das alles in deinem Kopf behältst - aber danke!

%Vor%     
ags 10.04.2012, 17:23
quelle

1 Antwort

7

Normalerweise sollten Swing-Programme paintComponent() überschreiben, anstatt paint() zu überschreiben, wie in Malen in AWT und Swing: Die Paint-Methoden . Basierend auf ScrollPanePaint , das unterhalb den scrollenden Inhalt zeichnet, überschreibt das folgende Beispiel paint() , um über den scrollenden Inhalt zu zeichnen.

%Vor%

Hinweis: Festlegen einer undurchsichtigen Komponente (z. B. JTable ) als eine Ansicht für den Bildlaufbereich wird seltsame visuelle Fehler verursachen, zum Beispiel das Bewegen der festen blauen Box beim Scrollen. Verwenden Sie setOpaque (false) in der Ansichtskomponente, um das Problem zu beheben.

    
trashgod 10.04.2012, 22:46
quelle