Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Problema JScrollPane

  1. #1

    Problema JScrollPane

    Ciao,spero possiate aiutarmi a risolvere il mio problema.
    Ho creato un'interfaccia grafica con un GridLayout con 2 colonne.Il pannello di sinistra contiene una serie di immagini che carico di volta in volta.A sua volta questo pannello lo inserisco all'interno di un JScrollPane per far in modo di poter visualizzare,attraverso la barra di scorrimento,tutte le immagini a poco a poco.
    Le immagini le visualizza...ma orizzontalmente.Io invece vorrei visualizzarle vericalmente!
    Questa è la parte di codice,dove sbaglio?

    codice:
    class Frame extends JFrame implements ActionListener
    {
        pannelloa a=new pannelloa();
        pannellob b=new pannellob();
        JMenuItem apriCartella,apriVideo;
        File f;
        String pathfile;
        
      
        public Frame()
        {
          setTitle("Analizzatore Video Medicali");
          setDefaultCloseOperation(EXIT_ON_CLOSE); 
          setExtendedState(MAXIMIZED_BOTH);
          
          JMenuBar barra=new JMenuBar();
          JMenu menu=new JMenu("File");
          apriVideo=new JMenuItem("Apri Video");
          apriCartella=new JMenuItem("Apri Cartella Immagini");
          barra.add(menu);
          menu.add(apriVideo);
          menu.add(apriCartella);
          apriVideo.addActionListener(this);
          apriCartella.addActionListener(this);
          this.setJMenuBar(barra);
          
          //creo un JScrollPane all'interno del quale inserirò il pannello "a"
          JScrollPane scroll=new JScrollPane(a,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
          Container pane=getContentPane();
          pane.setLayout(new GridLayout(1,2));
          pane.add(scroll);
          pane.add(b);
        }
    
    }
    
    
    
    
    class pannelloa extends JPanel
    {
      public pannelloa()
      {
       Toolkit tool = Toolkit.getDefaultToolkit();
       Dimension dim =tool.getScreenSize();
       setSize(dim.width/2,dim.height/2);
       setLocation(dim.width/2,dim.height/2);
       
      }
    }
    Ho provato a ridimensionare il pannello a,ma non è sercito a niente.
    Grazie anticipatamente per una vostra eventuale risposta.Ciao

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema JScrollPane

    Originariamente inviato da divincodin
    Le immagini le visualizza...ma orizzontalmente.Io invece vorrei visualizzarle vericalmente!
    Perché per default JPanel ha un FlowLayout .... layout manager in cui i componenti contenuti "fluiscono" da sinistra verso destra e possibilmente andando su più righe (hai presente il "fluire" del testo nelle pagine web o in un editor di testi??).

    E il fatto che il tuo pannelloa sia stato messo dentro un JScrollPane ha un altro risvolto importante. In questo caso JScrollPane si basa sul "preferred size" del suo contenuto (il tuo pannello) e il preferred size di un FlowLayout ..... è tale da avere una larghezza adatta a contenere tutti i componenti su 1 sola riga. Un FlowLayout in un JScrollPane in pratica non fluisce nemmeno!!!

    Usa un altro layout manager per il pannello, es un BoxLayout verticale.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ho usato il tuo consiglio,usando il BoxLayout

    codice:
          a.setLayout(new BoxLayout(a, BoxLayout.Y_AXIS));
          JScrollPane scroll=new JScrollPane(a);
    
          Container pane=getContentPane();
          pane.setLayout(new GridLayout(1,2));
          pane.add(scroll);
          pane.add(b);
    Il problema è che così me le dispone tutte su un'unica colonna.Io invece vorrei metterle magari su + colonne affiancate,in base alla dimensione del pannello (tipo quello che succede nella cartella delle "immagini" di windwos quando si seleziona la visualizzazione "anteprima").
    Questi sn i 2 metodi che richiamo per caricare le immagini nel pannello:

    codice:
        public void azione(File dir)   
        {    
            if(a.getComponentCount()!=0)  
            {
             a.removeAll();
             a.updateUI();
            }
            File f[] = dir.listFiles();
            ImageIcon icons[]=new ImageIcon[f.length];
            for(int i=0; i<f.length;i++) 
            {
             icons[i]=new ImageIcon(f[i].getAbsolutePath(),f[i].getName());
             ImageIcon adactIcon=new ImageIcon(getScaledImage(icons[i].getImage(),100,100));
             JButton thumbButton=new JButton(adactIcon);
             thumbButton.setAlignmentX(JButton.CENTER_ALIGNMENT);
             //creo un'etichetta per far visualizzare il nome della foto
             JLabel etichetta=new JLabel(f[i].getName());
             a.add(thumbButton);
             a.add(etichetta);
             a.revalidate();
            }
        }
          
        
        private Image getScaledImage(Image srcImg, int w, int h)
        {
          BufferedImage resizedImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
          Graphics2D g2 = resizedImg.createGraphics();
          g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
          g2.drawImage(srcImg, 0, 0, w, h, null);
          g2.dispose();
          return resizedImg;
        }
    Sempre con questi 2 metodi,senza utilizzare lo JScrollPane faceva ciò che volevo ma mancava la barra di scorrimento x poter visualizzare tutte le anteprime.
    Adesso c'è la barra ma al max sono riuscito a metterle in un'unica colonna o riga...e francamente esteticamente non mi piace affatto!

  4. #4
    In sostanza,mi sta bene che le immagini siano disposte su + riche e che fluiscano da sinistra a destra.Voglio riuscire soltanto a far creare una nuova riga non appena nel pannello oriziontalmente non c'è + spazio.Ecco xkè non capisco perchè non debba funzionare dando una dimensione fissa al pannelloa

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da divincodin
    Ecco xkè non capisco perchè non debba funzionare dando una dimensione fissa al pannelloa
    L'ho detto prima ma lo ripeto in modo più completo: JScrollPane ha bisogno di sapere la dimensione del contenuto. Se il contenuto implementa Scrollable usa i metodi di questa interfaccia, se il contenuto non implementa Scrollable (e questo è proprio il caso di JPanel), si basa sul preferred size.
    Se non imposti tu un preferred size al pannello, il preferred size è quello del flow layout e cioè ha una larghezza tale da contenere tutti i componenti in 1 sola riga (non "fluisce" su più righe).
    Se imposti tu un preferred size, le cose possono cambiare.

    Tu hai usato setSize()/setLocation(), ma JScrollPane non li considera!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Col setPreferredSize avevo già provato ed l'ho fatto anche adesso.Le anteprime delle immagini sono disposte come vorrei.Le barre spuntano in base ai parametri che inserisco ma non c'è il bottone per lo scorrimento delle barre.In sostanza sono lì soltanto per ornamento

    codice:
    JScrollPane scroll=new JScrollPane(a,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
          Container pane=getContentPane();
          pane.setLayout(new GridLayout(1,2));
          pane.add(scroll);
          pane.add(b);
    e questo è adesso la classe pannelloa


    codice:
    class pannelloa extends JPanel
    {
      public pannelloa()
      {
        Toolkit tool = Toolkit.getDefaultToolkit();
        Dimension dim =tool.getScreenSize();
        setPreferredSize(new Dimension(dim.width/2,dim.height/2));
      }
    }

  7. #7
    Prima che risponda tu,mi rispondo da solo...ho scritto una bestialità.
    Dipende infatti dal fatto che ho inserito in
    codice:
    setPreferredSize(new Dimension(dim.width/2,dim.height/2));
    dim.height/2.Il problema adesso è:non posso sapere a priori quanto deve essere "alto" il pannello poichè non so quante immagini conterrà la cartella che vado ad aprire!Una cartella può contenere 5 immagini oppure 100!

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.