Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361

    Problema con ScrollPane

    Salve a tutti, come da titolo sto avendo un problema a gestire un JPanel scrollabile.
    Ho trovato esempi online in cui viene creato un JScrollPane che occupa tutto il JFrame, mentre nell' esempio che posto sotto, io vorrei rendere scrollabile il pannello denominato "centroSud".

    Il problema è che la barra si forma se imposto come regola la sua presenza obbligatoria,
    se invece chiedo che compaia quando necessario e aggiungo componenti al pannello in eccesso, la barra non si crea.Ecco il codice :

    codice:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    public class Scroll extends JFrame
    {
        public static void main(String[] args)
        {
            JFrame frame=new JFrame("Esempio Scroll");
            frame.setSize(700,681);        
            frame.setLocation(20,20);    
            frame.setResizable(false);        
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container finestra=frame.getContentPane();
            finestra.setBackground(Color.WHITE);
            JPanel nord=newPanel(new JPanel(),700,110,Color.GREEN);
            JPanel ovest=newPanel(new JPanel(new BorderLayout(0,0)),442,540,Color.ORANGE);        
            JPanel centro=newPanel(new JPanel(new BorderLayout(0,0)),258,540,Color.WHITE);
            JPanel centroNord=newPanel(new JPanel(),258,200,Color.BLUE);
            JPanel centroSud=newPanel(new JPanel(new FlowLayout(SwingConstants.CENTER,0,0)),258,340,Color.RED);        
            JScrollPane lista=new JScrollPane(centroSud);
            lista.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            lista.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);    
            for(int i=0;i<20;i++)centroSud.add(newLabel("Scritta","",258,20));
            finestra.add(nord,BorderLayout.NORTH);
            finestra.add(ovest,BorderLayout.WEST);
            finestra.add(centro,BorderLayout.CENTER);
            centro.add(centroNord,BorderLayout.NORTH);
            centro.add(lista,BorderLayout.SOUTH);
            frame.setVisible(true);
        }
        public static JPanel newPanel(JPanel p,int h,int v,Color c)
        {
            p.setPreferredSize(new Dimension(h,v));
            p.setOpaque(true);
            p.setBackground(c);
            return p;
        }
        public static JLabel newLabel(String text,String align,int h,int v)
        {
            int a=SwingConstants.CENTER;
            if(align.equalsIgnoreCase("left"))a=SwingConstants.LEFT;
            else if(align.equalsIgnoreCase("right"))a=SwingConstants.RIGHT;
            JLabel l=new JLabel(text,a);
            if(h>0&&v>0)l.setPreferredSize(new Dimension(h,v));        
            return l;
        }
    }
    In particolare a me mostra 17 delle 20 label di prova che ho aggiunto, le ultime tre vengono nascoste senza che si aggiunga la barra di scorrimento.

    Grazie per l'aiuto !

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    In particolare a me mostra 17 delle 20 label di prova che ho aggiunto, le ultime tre vengono nascoste senza che si aggiunga la barra di scorrimento.
    In quel pannello scrollabile, con FlowLayout, le label possono effettivamente "fluire", su più righe, perché il pannello è fisicamente grande come la parte "view" di JScrollPane.

    Ma JScrollPane per sapere se/di quanto gestire lo scrolling, si affida al "preferred size" del pannello contenuto. E il preferred size di un FlowLayout è calcolato come quella dimensione che fa stare tutti i componenti in orizzontale su 1 (una!) sola riga.
    Pertanto per JScrollPane quel pannello non è da scrollare, anche se tu vedi molte righe che vanno anche fuori (sotto) dal pannello.

    Non è una buona idea quel FlowLayout. Se vuoi che ciascuna label sia su una "riga", allora usa o un GridLayout o un BoxLayout verticale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Grazie, come al solito hai risolto subito l'inghippo .

    Non ho ancora mai usato il BoxLayout, ora guardo la documentazione e faccio delle prove, comunque il GridLayout l'ho scartato perchè quelle label verranno aggiunte man mano e non so a prescindere il numero di celle che dovrò dichiarare.
    Con BoxLayout si può fare senza problemi ?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    il GridLayout l'ho scartato perchè quelle label verranno aggiunte man mano e non so a prescindere il numero di celle che dovrò dichiarare.
    Dal javadoc:
    public GridLayout(int rows, int cols)

    One, but not both, of rows and cols can be zero, which means that any number of objects can be placed in a row or in a column.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Bene questo indica che sono anche disattento

    Grazie mille ,ora faccio le mie prove e in caso chiedo dopo

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ok allora ho fatto un po' di prove ma sono ancora in alto mare.Ho provato a mettere per quel pannello il BoxLayout , il GridLayout e addirittura il GridBagLayout ma non riesco a ottenere ciò che voglio.
    Le label aggiunte continuano a non provocare la comparsa della barra, con il GridLayout gli ho pure aggiunto il parametro per lasciare lo spazio verticale tra le colonne della griglia, ottenendo solo il fatto di non fare visualizzare neanche una label se lo spazio lasciato non permette la visualizzazione di tutte le label!

    Posto comunque ciò che ho cambiato ma appunto non funziona, riusciresti a dirmi dove sbaglio?
    Vorrei aggiungere 3 JLabel per riga (in realtà di dimensione diversa ma per ora mi basta che siano uguali), e fare in modo che, aggiungendo la riga che uscirebbe dal pannello, compaia lo scroll e mi permetta di aggiungerne quante voglio.

    Intanto questo è il codice leggermente modificato:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.border.*;
    public class Scroll extends JFrame
    {
        public static void main(String[] args)
        {
            JFrame frame=new JFrame("Esempio Scroll");
            frame.setSize(700,681);        
            frame.setLocation(20,20);    
            frame.setResizable(false);        
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            Container finestra=frame.getContentPane();
            finestra.setBackground(Color.WHITE);
            JPanel nord=newPanel(new JPanel(),700,110,Color.GREEN);
            JPanel ovest=newPanel(new JPanel(new BorderLayout(0,0)),442,540,Color.ORANGE);        
            JPanel centro=newPanel(new JPanel(new BorderLayout(0,0)),258,540,Color.WHITE);
            JPanel centroNord=newPanel(new JPanel(),258,200,Color.BLUE);
            JPanel centroSud=newPanel(new JPanel(),258,340,Color.RED);
            centroSud.setLayout(new GridLayout(20,3,0,10));
            for(int i=0;i<60;i++)centroSud.add(new JLabel("Prova"));
            finestra.add(nord,BorderLayout.NORTH);
            finestra.add(ovest,BorderLayout.WEST);
            finestra.add(centro,BorderLayout.CENTER);
            centro.add(centroNord,BorderLayout.NORTH);
            JScrollPane lista=new JScrollPane(centroSud);
            lista.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            lista.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);        
            centro.add(lista,BorderLayout.SOUTH);        
            frame.setVisible(true);
        }
        public static JPanel newPanel(JPanel p,int h,int v,Color c)
        {
            p.setPreferredSize(new Dimension(h,v));
            p.setOpaque(true);
            p.setBackground(c);
            return p;
        }
    }
    Grazie intanto

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ok allora ho fatto un po' di prove ma sono ancora in alto mare.Ho provato a mettere per quel pannello il BoxLayout , il GridLayout e addirittura il GridBagLayout ma non riesco a ottenere ciò che voglio.
    Il punto è che stai cercando di fare svariate "forzature" che in genere non servono. Innanzitutto stai forzando il preferred size di tutti i pannelli. Sarebbe meglio ragionare in termini di contenuti, cioè di cosa dovranno contenere.

    Riguardo questo famigerato pannello centroSud, ci sono diverse questioni:
    - stai forzando il preferred size del pannello, quindi anche se ci mettessi 2000 label, non ottieni quello che vuoi.
    - hai messo il JScrollPane in un BorderLayout.SOUTH. In SOUTH viene rispettato solo il preferred height e quale è? È quello che viene chiesto al JScrollPane, il quale lo chiede al pannello aggiungendoci poi qualcosa del scroll pane (es. lo spazio per la/e barra/e). In sostanza il BorderLayout tenta di dimensionare il JScrollPane per far stare tutto il pannello! Ecco perché non scrolla. Sarebbe più sensato dare un preferred size al JScrollPane piuttosto che al pannello.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Grazie avevi ragione, dando il preferred size al JScrollPane compare la barra di scorrimento .

    Ma non è un'altra forzatura questo modo di procedere? Cioè se non setto il preferredSize il contenuto esce, se invece lo setto la dimensione diventa "vincolante" e quindi se le label diventano molte, il pannello tenta di far stare tutto in quelle dimensioni e ad esempio le 3 colonne del GridLayout diventano 5 per lo spazio a disposizione.

    Potrei cambiare il preferredSize ad ogni inserimento di una riga, ma io pensavo che fosse meglio lasciare gestire tutto allo ScrollPane che pensavo si ridimensionasse automaticamente per fare stare tutto il contenuto...


    [EDIT]

    Ah chiedo scusa, avevo lasciato per sbaglio il parametro di 20 righe per il GridLayout, se rimetto a 0 quel parametro le colonne non vengono più "sforzate" ad aumentare con l'aumento del contenuto,ma invece lo ScrollPane si ridimensiona come volevo.

    Grazie mille per il tempo dedicatomi e alla prossima!
    Ultima modifica di Ansharja; 24-05-2015 a 10:02 Motivo: Scritto una boiata

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.