Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78

    [java] JPanel scorrevole

    Salve sono nuovo! Sono qui per chiedere un aiuto.
    Sto sviluppando un programma in Java in cui ho un JFrame a cui aggiungo un JPanel con questo codice:
    codice:
    t=new DisegnaT();
    Container sfondo=getContentPane();	
    sfondo.add(t,"Center");
    Dove DisegnaT è una classe che estende JPanel su cui disegno semplicemente.
    Fino a qui tutto ok, ma ora ho la necessità di rendere il pannello scorrevole, perchè a volte può capitare che il disegno prodotto sul JPanel sia più lungo del JFrame, e cercando in giro ho trovato le classi JScrollPane e JScrollBar.
    Solo che non riesco ad usare nel modo corretto, perchè non m funziona!

    Qualcuno può aiutarmi?

  2. #2
    Si, puoi usare JScrollPane.
    nel tuo codice dovresti intergrarlo così.

    codice:
    t=new DisegnaT();
    JScrollPane pane=new JScrollPane(t):
    Container sfondo=getContentPane();	
    sfondo.add(pane,"Center");
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ehm... non è così semplice.
    JPanel non implementa l'interfaccia Scrollable, quindi non è "adatta" di per sé ad essere scrollabile (quindi, ad essere inserita in un JScrollPane). Occorre lavorare un po' più a fondo.

    Questa mia classe implementa Scrollable e rappresenta, appunto, un JPanel scrollabile:
    codice:
    package ft.scrollable;
    
    import java.awt.*;
    import javax.swing.*;
    
    /**
     *
     * @author LeleFT
     */
    public class ScrollablePanel extends JPanel implements Scrollable {
       private Dimension minDimension;
    
       public ScrollablePanel() {
          this( new Dimension(0, 0) );
       }
    
       public ScrollablePanel(Dimension minDimension) {
          this.minDimension = minDimension;
       }
       
       @Override
       public Dimension getPreferredSize() { return getPreferredScrollableViewportSize(); }
    
       @Override
       public Dimension getPreferredScrollableViewportSize() {
          Dimension ret = (minDimension != null) ? minDimension : new Dimension(0, 0);
    
          Component[] content = getComponents();
          for(Component c : content) {
             Point loc = c.getLocation();
             Dimension dim = c.getSize();
             if ((loc.x + dim.width) > ret.width) ret.width = loc.x + dim.width;
             if ((loc.y + dim.height) > ret.height) ret.height = loc.y + dim.height;
          }
    
          return ret;
       }
    
       @Override
       public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
           return 10;
       }
       
       @Override
       public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
           return 1;
       }
       
       @Override
       public boolean getScrollableTracksViewportHeight() { return false; }
       
       @Override
       public boolean getScrollableTracksViewportWidth() { return false; }
       
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    grazie!
    Però non capisco una cosa..se la mia classe che estende JPanel la facessi estendere JScrollPane non si riuscirebbe renderla scrollabile?

  5. #5
    Cavoli..
    che casino...
    pensavo potesse essere scrollabile, effettivamente ho sempre scrollato JTable quindi pensavo fosse la stessa cosa....sorry errore mio.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Polly008
    grazie!
    Però non capisco una cosa..se la mia classe che estende JPanel la facessi estendere JScrollPane non si riuscirebbe renderla scrollabile?
    Ehm... 2 cose che cozzano:

    1) Se la tua classe estende JPanel non può estendere nient'altro... in Java l'ereditarietà multipla non esiste

    2) Anche se esistesse... che senso avrebbe estendere JScrollPane? JScrollPane è un componente che permette di scrollare componenti scrollabili... mica è un componente scrollabile egli stesso. Stai confondendo il contenitore con il contenuto. Una bottiglia è in grado di contenere dei liquidi. Se tu hai un oggetto A che estende (cioè, è) una bottiglia... mica lo puoi mettere dentro ad una bottiglia...

    JScrollPane è un contenitore... in grado di contenere oggetti che implementano Scrollable (ovvero, oggetti scrollabili). JPanel è un componente qualunque... non implementa Scrollable, quindi non è scrollabile. La mia classe estende JPanel (quindi è un pannello) ed in più implementa Scrollable, quindi è un pannello scrollabile. Se vuoi, puoi estendere la mia classe o crearne una tua nuova che implementi Scrollable.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    Ho capito!
    Il mio DisegnaT ora estende la tua classe. Però ora nel JFrame cosa devo mettere di codice per renderla scrollabile? Perchè così com'è non lo è.

    Grazie

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Polly008
    Ho capito!
    Il mio DisegnaT ora estende la tua classe. Però ora nel JFrame cosa devo mettere di codice per renderla scrollabile? Perchè così com'è non lo è.

    Grazie
    Il codice che ti ha fornito schumy2000:
    codice:
    t=new DisegnaT();
    JScrollPane pane=new JScrollPane(t):
    Container sfondo=getContentPane();	
    sfondo.add(pane,"Center");
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Feb 2013
    Messaggi
    78
    Scusate l'insistenza ma così non funziona.
    All'esecuzione invece di mostrarmi le figure che disegno mi riempie tutto il JFrame di bianco.

    Ho fatto
    codice:
    public class DisegnaT extends ScrollablePanel
    e sul JFrame
    codice:
    t=new DisegnaT();	
    JScrollPane pane=new JScrollPane(t);
    Container sfondo=getContentPane();
    sfondo.add(pane,"Center");

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Mi sa che stiamo parlando di cose diverse.
    Se per "disegno" intendi dire che fai l'override di paintComponent() e usi Graphics, allora tutto questo non ti serve a nulla. Un oggetto è scrollabile in base al suo contenuto (ovvero, in base a quanti componenti esso contiene). Il tuo oggetto ha un contenuto vuoto: non contiene alcun componente, ma l'unico "contenuto" è sé stesso (il disegno è, appunto, il modo in cui il componente si presenta).

    Se tutto ciò che ti serve è avere un componente che si scrolla, ma che non deve contenere nulla, allora è sufficiente un JPanel semplice. Tutto ciò che devi tenere a mente sono alcuni concetti:

    1) Ogni volta che il componente deve essere ridisegnato (dopo uno scroll, dopo un ridimensionamento, dopo uno spostamento, dopo una sovrapposizione) viene richiamato il paintComponent(), che quindi deve ritornare a ridisegnare l'intero pannello

    2) Se vuoi vedere l'effetto dello scroll, allora il tuo pannello deve avere una dimensione (impostata con setPreferredSize() ) più grande della dimensione del suo contenitore (il JScrollPane)

    Quindi, lascia perdere la mia classe... ha altri scopi.
    Torna ad estendere JPanel
    Imposta una dimensione molto grande con setPreferredSize()
    Aggiungi il tuo oggetto ad un JScrollPane e aggiungi questo alla finestra, come nel codice precedente.


    Ciao.

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.