Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    Problema con scroll di un JPanel

    Nella mia interfaccia grafica ho un pannello (JPanel) dentro il quale attraverso un FlowLayout inserisco in righe altri vari pannelli più piccoli...il problema è che quando la somma delle dimensioni dei pannelli che inserisco supera quella del pannello contenitore il tutto andrebbe "scrollato"...ho provato a fare:
    -siamo all'interno di un JFrame
    -panel è il pannello contenitore
    -PannelloCreato è una classe creata da me che estende JPanel



    codice:
    JPanel panel = new JPanel ();
    panel.setLayout(new FlowLayout());
    PannelloCreato pc=new PannelloCreato(parametro a);
    PannelloCreato pc1=new PannelloCreato(parametro b);
    PannelloCreato pc2=new PannelloCreato(parametro c);
    panel.add(pc);
    panel.add(pc1);
    panel.add(pc2);
    JScrollPane sp=new JScrollPane (panel);
    getContentPane().add(panel);
    questo è in linea generale quello che ho fatto ma nonostante tutto panel non viene scrollato quando i PannelloCreato disposti in righe superano la dimensione di panel stesso...perchè?dove sbaglio?Come posso risolvere?

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Si ma devi aggiungere sp alla finestra... non il pannello. E credo sia meglio se il ScrollPane venga inserito in un JPanel e poi posizionato sul frame. ^^

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da Patrick Jane
    Si ma devi aggiungere sp alla finestra... non il pannello.
    Emmm quello è stato è stato un errore di distrazione che ho fatto qui...nel codice ho fatto bene

    Originariamente inviato da Patrick Jane
    E credo sia meglio se il ScrollPane venga inserito in un JPanel e poi posizionato sul frame. ^^
    Nel codice ho fatto proprio in questo modo...nell'esempio qui postato ho scritto in ql modo per renderla più semplicistica e per rendere l'idea del problema...

    Fatto sta che anche come dici tu la cosa non funziona...altre idee e spiegazioni?

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    JPanel non è Scrollable di default (non implementa tale interfaccia, come fa, ad esempio, JList). Questo significa che devi essere tu a "controllare" il pannello che deve essere scrollato affinchè si ridimensioni adeguatamente.

    Il pannello interno, generalmente, prende le dimensioni del suo contenitore (il JScrollPane). Se vuoi far sì che questo pannello interno sia scrollabile, devi impostarne a mano le dimensioni man mano che aggiungi componenti al suo interno. In particolare, se aggiungi un nuovo componente, devi far sì che il pannello aumenti (all'occorrenza) la sua dimensione affinchè il nuovo componente sia visibile. Al resto penserà il JScrollPane.

    Non è un'operazione banale perchè devi tenere traccia di qual è la dimensioni minima che il pannello deve avere affinchè riesca a visualizzare tutti i componenti attualmente al suo interno (tenendo conto di posizione e dimensione di questi ultimi).


    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da LeleFT
    JPanel non è Scrollable di default (non implementa tale interfaccia, come fa, ad esempio, JList). Questo significa che devi essere tu a "controllare" il pannello che deve essere scrollato affinchè si ridimensioni adeguatamente.

    Il pannello interno, generalmente, prende le dimensioni del suo contenitore (il JScrollPane). Se vuoi far sì che questo pannello interno sia scrollabile, devi impostarne a mano le dimensioni man mano che aggiungi componenti al suo interno. In particolare, se aggiungi un nuovo componente, devi far sì che il pannello aumenti (all'occorrenza) la sua dimensione affinchè il nuovo componente sia visibile. Al resto penserà il JScrollPane.

    Non è un'operazione banale perchè devi tenere traccia di qual è la dimensioni minima che il pannello deve avere affinchè riesca a visualizzare tutti i componenti attualmente al suo interno (tenendo conto di posizione e dimensione di questi ultimi).


    Ciao.
    Innanzitutto grazie per la risposta.
    Seguendo i tuoi suggerimenti ho provato a fare tipo(sempre riprendendo l'esempio che ho fatto sopra):


    codice:
    int componenti=0;
    JPanel panel = new JPanel ();
    panel.setLayout(new FlowLayout());
    PannelloCreato pc=new PannelloCreato(parametro a);
    PannelloCreato pc1=new PannelloCreato(parametro b);
    PannelloCreato pc2=new PannelloCreato(parametro c);
    panel.add(pc);
    componenti++;
    panel.add(pc1);
    componenti++;
    panel.add(pc2);
    componenti++;
    JScrollPane sp=new JScrollPane (panel);
    //supponendo che ogni PannelloCreato occupi in altezza circa 50 pixel
    panel.setPreferredSize(new Dimension (panel.getWidth(), 50*componenti) );
    panel.validate();
    panel.repaint(); 
    getContentPane().add(sp);
    ma anche in tal modo non ottengo i risultati sperati...mi dai qualche dritta?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non è sufficiente ridimensionare il pannello: è necessario anche "notificare" il JScrollPane che qualcosa è cambiato.

    Ti posto un esempio che ho sviluppato al volo:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class ProvaPannelli extends JFrame implements ActionListener {
    
       private JPanel pannello;
       private JScrollPane scroller;
       private JButton cmdAggiungi;
       private int count;
    
       public ProvaPannelli() {
          count = 0;
    
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          pannello = new JPanel();
          pannello.setLayout( null );
    
          scroller = new JScrollPane( pannello );
    
          cmdAggiungi = new JButton("Aggiungi Label");
          cmdAggiungi.addActionListener( this );
    
          JPanel jpCmd = new JPanel( new FlowLayout(FlowLayout.CENTER, 10, 10) );
          jpCmd.add( cmdAggiungi );
    
          c.add(scroller, BorderLayout.CENTER);
          c.add(jpCmd, BorderLayout.SOUTH);
    
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setTitle("Prova Pannelli");
          setResizable( true );
          setSize(800, 600);
          setVisible( true );
       }
    
       public void actionPerformed(ActionEvent ae) {
          JLabel lbl = new JLabel("Label numero " + (count+1));
          lbl.setBounds(10, (count * 20)+1, 100, 20);
          count++;
          pannello.add( lbl );
          Dimension d = pannello.getSize();
          if (d.height < (count * 20)) {
             // Devo ridimensionare il pannello
             d.height = (count * 20);
             pannello.setPreferredSize( d );
             pannello.repaint();
             pannello.doLayout();
             scroller.getViewport().doLayout();
          }
          repaint();
          doLayout();
       }
    
       public static void main(String[] args) {
          ProvaPannelli pp = new ProvaPannelli();
       }
    }
    Ad ogni pressione del pulsante viene aggiunta una JLabel al pannello (una sotto l'altra). Quando la dimensione del pannello non è sufficiente a visualizzarle tutte, la aumento e notifico il ViewPort del JScrollPane.

    Osserva anche che la dimensione (altezza) del pannello la calcolo tenendo conto della dimensione (altezza) delle JLabel (20).

    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
    Nov 2009
    Messaggi
    755
    Risolto grazie alla tua risposta....grazie 1000!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Ora che ci penso per un progetto dello scorso anno avevo fatto in questo modo... me ne ero scordato. :P

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.