Newsgroup: it.comp.java
Titolo: Dimenisoni di un JDesktopPane

Vorrei creare un JDesktopPane all'interno di un JScrollPane, in modo
che, se le JInternalFrame vengono spostate o ingrandite oltre le
dimensioni del JFrame principale, si posso scrollare sul JDesktop e
poterle vedere.
Ho scritto questo codice:
.
.
.
            cont=ilFrame.getContentPane();
            ilDesktop=new JDesktopPane();
            JScrollPane loScroller=new JScrollPane(ilDesktop);
            cont.add(loScroller);
            ilFrame.show();
            JInternalFrame prova=new
JInternalFrame("Prova",true,true,true,true)
            ilDesktop.add(prova);
            prova.setSize(1000,1000);
            prova.show();
.
.
.
perň le dimensioni del JDesktopPane restano invariate anche quando vi
inserisco JInternalFrame enormi, cosě non compaione le scrollbar e non
posso vedere l'intera area realmente occupate dai frame interni.
Come mai le dimensioni del JDesktopPane restano fisse e non variano in
accordo con I frame in esso inseriti?
Come posso fare per ottenere il risultato desiderato?
Grazie.

 in accordo con I frame in esso inseriti?
In mancanza di risposte migliori riciclo una mia del 24/6:
...il DefaultDesktopManager non modifica le dimensioni del
JDesktopPane quando vengono spostati i JInternalFrame e quindi il
JScrollPane non sa che deve modificarsi. Percio' occorre alterare il
comportamento di base.
Questo che segue e' solo un esempio. Bisogna tenere conto anche di
altri casi, ma te li lascio come esercizio ;-)
desktop = new JDesktopPane();
desktop.setDesktopManager(
  new DefaultDesktopManager() {
    public void endDraggingFrame(JComponent f) {
      super.endDraggingFrame(f);
      Rectangle r = f.getBounds();
      int maxX = Math.max(r.x+r.width,desktop.getWidth());
      int maxY = Math.max(r.y+r.height,desktop.getHeight());
      if(desktop.getWidth() < maxX || desktop.getHeight() < maxY) {
        desktop.setPreferredSize(new Dimension(maxX,maxY));
        desktop.revalidate();
      }
    }
  }
);
--
Ciao. Leonardo 
bos...@uno.it
 
http://surf.to/tetractys

 Ciao. Leonardo 
bos...@uno.it
 
http://surf.to/tetractys
Ero arrivato anch'io a una soluzione simile.
Solo che implemento la funzione che ricalcola le dimensioni come metodo
indipendente, poi lo chiamo da tutti i metodi che ne abbisognano:
de/iconify, open, close, enddragging, end resizing ....
Inoltre il massimo non lo calcolo tra le dimensioni correnti e i bound
della finestra modificata, bensi` ciclo su tutte le finestre
(tralasciando le dimensioni correnti), e trovo la dimensione che contiene
la piu` ingombrante. Setto po iil desktop una ventina di punti piu` largo
in entrambe le direzioni.
Faccio anche precedere il tutto da un ciclo che sposta tutte le finestre
"parallelamente" in modo che la loro location sia >=0. Infatti se
ridimensiono una finestra allargandola verso l'alto, perdo la barra di
intestazine e non la posso piu` spostare.
Cosi` il desktop si ridimensiona magicamente anche rimpicciolendosi se
elimino finestre!
Ancora una cosa.
La revalidate() non sembra bastare, cosi` ho dovuto cercare l'ultimo
parent e chiamare validate(0 su quello:
c=f.getParent(): //trova il desktop
while(c.getParent()!=null)
    c=c.getParent();
Che ne pensi?
Ciao
P.S. a chi ha il mio stesso problema posso inviare il sorgente in modo
che ne possa usufruire.

 Che ne pensi?
Non so, dovrei vedere il tuo sorgente. Nel mio esempio funziona.


Leonardo Boselli wrote:

Ho provato revalidate() e funziona.
Devo dire che usando linux, ogni tanto succedono cose strane....
stesso codice: lo compilo e non funziona, lo ricolmpilo e funziona. O
viceversa.
Horiprovato la revalidate() e ha funzionato.
Invio in allegato il codice di DynDesktopManager, cosi`  lo potete
provare, sventrare, migliorare (ci vuole poco) e tutto il resto!
Chiedo solo di riinviarmi le vostre modifiche, in modo che tutti ne
possonao poi fruire, visto che pare molto utile avere un desktop di
dimensioni variabili.
Ciao.
P.S. prima di inviarlo ho cercato di "pulirlo" un po', ma non ho avuto
modo di ritestarlo.
P.P.S. sul metodo iconify, ho preferito glissare. Infatti quando chiamo
la recalculateSize(), nel momento in cui faccio f.getParent() ottengo un
puntatore nullo, con conseguente eccezione all'istruzione
dpt.getAllFrames(). Mi sembra che vada bene, intanto se iconifico, non
c'e` tutta la necessita` di ridimensionare il desktop.
P.P.P.S. manca la parte che sposta tutte le icone entro i bouds del
desktop quando si ridimensiona. Ora, se si rimpicciolisce il desktop, lo
icone spariscono perche` restano in una posizione troppo bassa.