PDA

View Full Version : [java] dimensione scrollPane


pumppkin
16-01-2007, 12:19
Ciao, ho un JPanel che mi fa da "desktop" e all'interno di esso c'è un JScrollPane...quando apro un'immagine (è una specie di editor di immagini) lo scrollPane mi si adatta alle dimensioni del "desktop", ma quando ridimensiono il frame principale questo mi rimane nella stessa posizione (praticamente non mi vengono visualizzate più le barre di scroll)...
allora, quando creo lo scrollpane setto le dimensioni in questo modo:
innerScrollPane.setPreferredSize(new Dimension(Editor.getEditor().getDesktop().getWidth(),Editor.getEditor().getDesktop().getHeight()));..
teoricamente al resize del frame dovrei fare la stessa cosa, ma non funziona...come si può risolvere?

è strano perchè è come se il desktop mantenesse sempre le stesse dimensioni...però ho notato che se chiudo l'immagine ma non il programma e apro di nuovo l'immagine (stavolta il frame principale è già ridimensionato) le scrollbar mi spuntano nella posizione corretta (cioè ridimensionate)...

leox@mitoalfaromeo
16-01-2007, 12:55
dalla sommità della mia ignoranza, temo sia una questione legata al thread che gestisce la visualizzazione...come sommamente mi fu spiegato tempo fa qui...

PGI-Bis
16-01-2007, 13:13
Può essere di tutto ma se dovessi scommettere direi che è un problema di LayoutManager. In questo caso per risolvere la svista occorre avere la struttura dell'interfaccia grafica a partire dalla finestra principale fino al contenuto del JViewport proiettatto dal tuo JScrollPane: chi contiene cosa e con quale LayoutManager.

pumppkin
16-01-2007, 13:57
allora, spero di non sbagliare (il programma lo ha fatto un altro, io lo sto solo modificando) ma la disposizione dovrebbe essere questa:
JFrame è il contenitore principale
contiene
JPanel chiamato "desktop" con BorderLayout
contiene
a sud una state bar con alcuni parametri
a centro richiamo una classe (chiamata SVGFrame) che estende il JPanel
che contiene lo scrollPane (chiamato innerScrollPane)
lo scrollPane contiene un JPanel in cui vengono visualizzate delle canvas

PGI-Bis
16-01-2007, 14:05
Il JPanel che contiene il JScrollPane che layout usa?

pumppkin
16-01-2007, 14:07
è solo una classe che estende l'oggetto JPanel e, nel mio caso, non ha nessun Layout

PGI-Bis
16-01-2007, 14:25
Allora ho capito male io.

Al centro del pannello del contenuto del JFrame (BorderLayout) c'è una classe SVGPanel che estende JPanel e contiene un JScrollPane (innerScrollPane) o sta da qualche altra parte?

pumppkin
16-01-2007, 14:39
No, all'interno di jframe c'è un jpanel(quello chiamato desktop)..a sua volta, dentro il jpanel (posizionato al centro) c'è una classe svgFrame che estende jPanel(il nome della classe può trarre in inganno) e all'interno di questa classe c'è uno scrollpane (chiamato innerscrollpane)

PGI-Bis
16-01-2007, 14:52
Oook.

SVGFrame che layout usa?

pumppkin
16-01-2007, 15:01
non ho utilizzato nessun setLayout quindi non ha un layout

PGI-Bis
16-01-2007, 15:11
Quasi :D. Se non imposti un layout allora un JPanel usa FlowLayout.

FlowLayout attesta il contenuto in base alle sue dimensioni preferite. Se a te interessa che il contenuto si espanda ad occupare tutto lo spazio disponibile al contenitore allora prova ad usare un GridLayout. Puoi farlo semplicemente dichiarando nel costruttore come prima istruzione:

super(new GridLayout(1, 1));

senza bisogno di altri interventi.

pumppkin
16-01-2007, 15:17
grandissimo!!!...adesso funziona alla grande!! :yeah: ....grazie mille!!

un'ultima cosa...che vuol dire

Se a te interessa che il contenuto si espanda ad occupare tutto lo spazio disponibile al contenitore

lo volevo spiegato meglio per capire bene come funziona il gridlayout

PGI-Bis
16-01-2007, 15:25
Be', vuol dire quello che hai visto succedere impostando il layout a GridLayout.

Tutto parte dalla finestra. La finestra ha un contenitore predefinito in cui finiscono le cose che ci aggiungi. Questo contenitore ha una certa larghezza ed una certa altezza.

Quando infili qualcosa in un contenitore la posizione e le dimensioni che assume questo qualcosa dipendono sia dal LayoutManager sia dalle proprietà di ciò che hai aggiunto.

Una differenza l'hai già sperimentata. Se il contenitore ha un FlowLayout come LayoutManager allora quello che aggiungi assume la sua dimensione preferita e una posizione che dipende dal LayouManager. Se usi un GridLayout(1, 1) quello che aggiungi assume la dimensione del contenitore (meno il bordo). Quest'ultimo fatto è ciò che intendo per espansione.

pumppkin
16-01-2007, 15:28
ti ringrazio nuovamente...sei stato di grande aiuto!