Thumbnail-Position per Mausklick ändern

kubilay

Grünschnabel
Hallo,

die Thumbs werden zur Zeit aus der Platte gelesen und über FlowLayout einfach nacheinander gezeichnet.

Ich möchte, wenn ein Thumbnail angeklickt wird ( das sich nicht am Anfang der Zeile befindet ), der angeklickte und alle sich dahinter befindenden Thumbs ab der nächsten Zeile wieder in der richtigen Reihenfolge gezeichnet werden.


Bsp.:

1. Zeile : T1 T2 T3 T4 T5
2. Zeile : T6 T7

T3 wird angelickt,

Resultat :

1. Zeile : T1 T2
2. Zeile : T3 T4 T5 T6 T7

Die Zeilen und Spalten müssen sich an das Thumbgröße anpassen, wenn sie hoch/runter skaliert werden.

Da ich zur Zeit nur mit FlowLayout arbeite und die Thumbs der Reihe nach anzeige, ist es für die o.b. Aufgabe leider nicht geeignet.

Was für eine Komponente/Container/LayoutManager würde in Frage kommen ?
 
Hallo,

sehr interessantes Problem.
Aus der Beschreibung entnehme ich das jedes Thumbnail in eine seperate Komponente gezeichnet wird und diese zuvor an einen Container zur Anzeige geadded wurde.
Soweit korrekt ?

Die größte flexibilität hat man mit dem GridBagLayout, würde ich jedoch HIER von abraten.

Für mich klingt es entweder nach LayoutManager auf null setzen und die positionierung
explizit und absolut selbst zu übernehmen ODER eigenen LayoutManager schreiben.

Da die zweite variante nicht ganz ohne ist (grade in diesem speziellen Fall) würde ich
zur ersteren raten.

Gruß JAdix
 
Hallo JAdix,

danke für den Tip.

// Die größte flexibilität hat man mit dem GridBagLayout, würde ich jedoch HIER von abraten.

Nur aus Neugier. Welche Probleme könnte es geben ?

Gruß
 
Hallo kubilay,

prinzipiell kann man das GridBagLayout natürlich für deinen Fall nutzen.

Bei änderungen der Positionen muß dann aber jede Komponente (Thumbnail)
die ihre Position wechselt aus dem Container mit remove(Component) entfernt
und mit "neuen" GridBagConstraints wieder mit add(Component,Constraints)
eingefügt werden. Nach den Änderungen muß dann das Layout mit validate()
neu validiert werden.

Im Hintergrund mußt du aber eh die Positionen (zumindest als Indexwerte) der
Thumbs-Komponenten verwalten. Da macht ein bischen herumrechnen an einem
Gitternetz, an dem die Komponenten dann mit setBounds(x,y,w,h) ausgerichtet
werden, nicht so viel arbeit. Meiner Meinung nach.

Durch die remove-add-validate Geschichte stößt man ja auch eine Menge an.
Man bittet den Container zu removen bzw. zu adden der sagt wieder dem
LayoutManager was sache ist. Und beim validate tauschen LayouManager,Container
und Komponenten nochmals rege Daten aus, bis alles wieder sitzt.

Ich weiß nicht wieviele Thumbs du auf einmal darstellen willst ?
Aber da verpufft evtl. ein wenig Rechenleistung, und man will ja flüssig arbeiten, oder ?

Gruß JAdix
 
Hallo JAdix,

danke für die Info. Das mit setLayout(null) funktioniert zur Zeit mit der Anzeige wunderbar.
Das mit dem Anklicken muss ich neu implemtieren. Leider reagiert der JScrollPane nicht mehr. Der Code ist wie zuvor geblieben.

Code:
private JPanel getJContentPane(){
	if(jContentPane == null) {
		jContentPane = new JPanel(new BorderLayout());
                jContentPane.add(getFileTree(), BorderLayout.WEST);
                JScrollPane scrp = new JScrollPane();
                scrp.setHorizontalScrollBarPolicy(
                      JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
                scrp.setVerticalScrollBarPolicy(
                      JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		scrp.setViewportView(getZeichenFlaeche());      
		jContentPane.add(scrp, BorderLayout.CENTER);
		jContentPane.add(getMenueBarPanel(), BorderLayout.PAGE_START);
	}
	return jContentPane;
}

Hast du vielleicht eine Idee, wo das Problem liegen könnte ?

Gruß Kubilay
 
Hallo, hallo ...

ich denke es liegt an folgendem :

Zuvor hat das ScrollPane die preferedSize des Viewports über den LayoutManager
des darin befindlichen Panels bezogen.

( So nun darf man mich für diesen Satz erstmal hauen ;) )

Versuch mal die getPreferedSize-Methode deiner ZeichenFläche zu überschreiben.
Erstmal mit einem festen Rückgabewert (größer als die ViewPort-Fläche).

Wenn du dann wieder rumscrollen kannst, hast du deinen ansatzpunkt für weitere
überlegungen ...

Gruß JAddix
 
Hallo JAddix,

das mit dem Scrollen funktioniert jetzt. Immer wenn was neues auf die Fläche gezeichnet wird, überschreibe ich setPreferredSize(new Dimension(screenWidth, yAnker+pictureSize)).

Danke für den Tip ;)

Gruß Kubilay
 
Zurück