PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JScrollPane Problemstellung


RMC
2006-08-28, 18:03:09
Wie kann man Folgendes erreichen?

Gegeben sei eine JScrollPane, dessen Inhalt sich mit Scrollbalken verschieben lässt. Der Rahmen ist gezwungenermaßen viereckig. Hier ein Bild wie es normalerweise üblich ist:

http://img118.imageshack.us/img118/1903/scrolldemo2il7.gif (http://imageshack.us)

Jetzt möchte ich gern, dass der zu scrollende Inhalt nicht von einer eckigen Umrandung begrenzt wird, sondern durch einen Rahmen beliebiger Form, ungefähr so:

http://img175.imageshack.us/img175/5853/scrolldemo2ua7.jpg (http://imageshack.us)

Der Inhalt (hier mit den bunten Kreisen) soll natürlich _unter_ der grauen Begrenzung weiterscrollen. Diese zusätzliche Umrandung in dieser komischen Form sei jetzt zB ein PNG-Bild mit Alphakanal, das über dem Inhalt drüber liegen soll.

Zwei Möglichkeiten hab ich schon ausprobiert, die leider nicht ganz so funktionieren wie ich es gerne hätte:

1) Das Rahmenbild wird ebenfalls in den scrollenden Inhalt eingefügt (es bewegt sich demnach mit) und durch Gegenrechnen der Brewegung immer um die Anzahl an Pixeln auf x und y Achse zurückgesetzt, sodass die Illusion entsteht dass sich der Rahmen eigentlich nie bewegt. Leider fällt es doch auf, er hüpft leicht hin und her und flackert zusehends.

2) Das Bild wird einfach über die gesamte Scrollpane drübergelegt, allerdings wird es beim Scrollen dann übermalt. (Könnte sein dass die paint-Reihenfolge nicht richtig ist, imho aber schon)

Vielleicht gibts noch eine andere Lösung oder eine besseren Vorschlag zu meinen bisherigen.

Danke :)

mithrandir
2006-08-28, 18:29:44
Schon mal dran gedacht, die paint-Methode des Containers (also in dem Fall der ScrollPane) zu überschreiben? Dort solltest du keine Gegenrechnungen machen müssen:

public class MyScrollPane extends JScrollPane
{
public MyScrollPane( Component c )
{
super( c );
}

public void paint( Graphics g )
{
super.paint( g );

g.drawWhateverYouWant();
}
}

HellHorse
2006-08-28, 21:34:47
glass pane (http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html#glasspane)?

RMC
2006-08-30, 00:37:56
Hm Glass Pane klingt gut. Allerdings, auch mit dem Überschreiben der paint-Methode landet das Bild dann immer im Scrollbereich drin.

Mein Aufbau ist folgender:

Ich hab ein JFrame, welches ein großes JPanel besitzt, in welchem die ganze GUI gezeichnet wird (bestehend aus mehreren JPanels die sich die Oberfläche aufteilen, welche wiederum Buttons und Textfelder etc. beinhalten sowie eine JScrollPane in der Mitte für Übergroßen Inhalt).

Sprich:

JFrame -> JPanel (root) -> JPanel(rechts), JPanel(links), JScrollPane(center) etc.

Nun will ich etwas über alle diese Elemente drüberzeichnen...wie genau funktioniert das mit der GlassPane ? Ich habs ausprobiert, aber es landet auch immer wieder im Scrollbereich (und lässt sich somit verschieben).

HellHorse
2006-08-30, 09:41:42
Schau dir einfach den Link an, da gibt's viel Erklärung und noch mehr Beispielcode. Du musst allerdings schon schauen, dass du es über dem Viewport landet.

RMC
2006-08-31, 17:53:52
Ja ich hab mir das Beispiel angeschaut aber ich versteh noch nicht ganz, warum da unbedingt die Punkte herumkonvertiert werden müssen?

Ich habe bei dem Beispiel auf die contentPane vom Frame ein JPanel gelegt, welches alle anderen Elemente enthält um meinen Fall zu simulieren.

Beim herumkonvertieren allerdings enspricht der neue Punkt nicht exakt dem alten und ist somit um ca. 30 Pixel auf der y-Achse verschoben, was zur Folge hat, dass ich die Checkbox anklicken kann wenn ich mich 30 Pixel darunter befinde :(

Wieso funktioniert das zb nicht:


Point glassPanePoint = e.getPoint();
Component component = SwingUtilities.getDeepestComponentAt(contentPane, glassPanePoint.x, glassPanePoint.y);
if (component != null)
{
component.dispatchEvent(new MouseEvent(..usw.));
}


Indem ich einfach den geklickten Punkt weiterleite...wo is denn da das Problem?

HellHorse
2006-08-31, 18:36:15
Ja ich hab mir das Beispiel angeschaut aber ich versteh noch nicht ganz, warum da unbedingt die Punkte herumkonvertiert werden müssen?
Um sie von globalen (glass pane) auf lokale (deppest component) Koordinaten umzurechen.

Wieso funktioniert das zb nicht:
Weil du die Koordinaten des glass panes hast. Das liegt nicht über dem content pane sondern über dem gesamten Frameinhalt (ev sogar das dem ganzen Frame) also auch Menubar und solchen Gesichten.

Vielleicht ist JViewport subclassen #paintComponent overriden und clippen doch die einfachere Lösung.

RMC
2006-09-01, 12:55:51
Gut die GlassPane konnte ich jetzt auf mein Programm anwenden, auch wenn sie noch mit (anderen) Fehlern läuft.

Prinzipielle Frage: kann man GlassPanes (oder ich sag mal ähnliche "Konzepte") nicht auch auf JPanels oder abgegrenzte Bereiche der Oberfläche anwenden? Muss das unbedingt das ganze JFrame betreffen? :(

HellHorse
2006-09-11, 21:06:24
Prinzipielle Frage: kann man GlassPanes (oder ich sag mal ähnliche "Konzepte") nicht auch auf JPanels oder abgegrenzte Bereiche der Oberfläche anwenden? Muss das unbedingt das ganze JFrame betreffen? :(
IIRC nur top-level Komponenten.