Visualizzazione dei risultati da 1 a 10 su 15

Hybrid View

  1. #1
    Dimentica il mio esempio e prova con il secondo di questi codici:

    1° Codice (qui il problema non sussiste)

    codice:
    package prova;
    
    import java.awt.*;
    
    import javax.swing.*;
    
    public class Esempio extends JFrame {
        
        public Esempio() {
            setSize(200, 200);
            JPanel jp = new JPanel(); 
            jp.setLayout(new GridLayout(20, 20)); 
            int b = 0; 
            for(int i = 0; i < 20; i++) { 
              for(int j = 0; j < 20; j++) { 
                jp.add(new JButton("Button " + b)); 
                ++b; 
              } 
            } 
            JScrollPane jsp = new JScrollPane(jp); 
            add(jsp, BorderLayout.CENTER); 
            getContentPane().add(jsp, BorderLayout.CENTER);
        }
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Esempio interfaccia = new Esempio();
                    interfaccia.setVisible(true);
                }
            });
        }
    
    }
    2° Codice (qui compare la barra orizzontale ma io vorrei che comparisse quella verticale)

    codice:
    package prova;
    
    import java.awt.*;
    
    import javax.swing.*;
    
    public class Esempio extends JFrame {
        
        public Esempio() {
            setSize(200, 200);
            JPanel jp = new JPanel(); 
            jp.setLayout(new FlowLayout()); 
            int b = 0; 
            for(int i = 0; i < 20; i++) { 
              for(int j = 0; j < 20; j++) { 
                jp.add(new JButton("Button " + b)); 
                ++b; 
              } 
            } 
            JScrollPane jsp = new JScrollPane(jp); 
            add(jsp, BorderLayout.CENTER); 
            getContentPane().add(jsp, BorderLayout.CENTER);
        }
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Esempio interfaccia = new Esempio();
                    interfaccia.setVisible(true);
                }
            });
        }
    
    }

    Il problema è che io vorrei la barra verticale e allo stesso tempo il FlowLayout. Detto in altro modo vorrei la botte piena e la fidanzata ubriaca (non sono sposato). Così dovrebbe essere più semplice capire. Leggi il secondo codice, dimentica il primo; non posso usare il GridLayout().

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    Il problema è che io vorrei la barra verticale e allo stesso tempo il FlowLayout.
    Il punto è proprio questo. FlowLayout, come ho detto nell'altra tua discussione, rispetta il preferred size dei componenti, che quindi stanno tutti alla loro dimensione "preferita". Ma non è questo il problema.
    I componenti però "fluiscono" su più righe solo quando la dimensione del contenitore (che usa il FlowLayout) non dipende dal suo contenuto ma dal contesto in cui si trova tale contenitore.

    Spiego con un esempio: nel content pane di JFrame (BorderLayout di serie) metti nella parte CENTER un JPanel con il FlowLayout. Supponiamo che nelle altre 4 aree non ci sia nulla. In questo caso la dimensione del JPanel è dipendente e proporzionale sostanzialmente solo dalla dimensione del JFrame (insomma è tutto lo spazio del content pane).
    In questa condizione i componenti possono "fluire" su più righe nel FlowLayout.

    Se metti un JPanel con FlowLayout dentro un JScrollPane le cose sono ben diverse. JScrollPane ha bisogno di sapere quanto è grande il componente da scrollare per sapere se/di quanto mostrare le scrollbar. E cosa fa? Di norma JScrollPane "chiede" il preferred size al componente. Che a sua volta lo chiede al layout manager.
    Ebbene: FlowLayout calcola il preferred size come il rettangolo che fa stare tutti i componenti su 1 sola riga!! Quindi in questo caso non fluiranno mai! Attenzione: non è un baco, è una cosa by design.

    Quindi o imponi al JPanel un preferred size che ti va bene e faccia fluire i componenti su più righe ..... o non si può fare.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    codice:
            add(jsp, BorderLayout.CENTER); 
            getContentPane().add(jsp, BorderLayout.CENTER);
    Ah e sappi che queste due righe fanno sostanzialmente la stessa cosa! Infatti da Java 5, il add() diretto su JFrame fa semplicemente un "forward" (in pratica fa da passacarte) verso getContentPane().add().
    Ultima modifica di andbin; 09-01-2014 a 22:11
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.