Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    JLabel una sotto l'altra in un JPanel

    Sto creando un'interfaccia grafica in java e non riesco a sistemare titolo, sottotitolo e una descrizione. In pratica vorrei che al ridimensionamento della mia finestra il titolo, il sottotitolo e la descrizione restino in alto e centrati ma sempre in alto, secondo voi come posso fare?

    Il mio desiderio e di poter scrivere:

    getContentPane().add(upannell, BorderLayout.NORTH);

    dove upannell contiene appunto titolo, sottotitolo e descrizione...

    A presto e grazie


  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
    getContentPane().add(upannell, BorderLayout.NORTH);

    dove upannell contiene appunto titolo, sottotitolo e descrizione...
    E questo puoi benissimo farlo (se il content pane ha ancora il BorderLayout di default). Il punto è quale layout manager usare per upannell!
    Potresti usare un GridLayout con 3 celle in verticale 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
    Grazie andbin, con il GridLayout avevo già provato questa soluzione:

    codice:
    // Creazione del titolo, del sottotitolo e della descrizione
            JPanel pannello1 = new JPanel();
            JL_titolo = new JLabel(titolo);
            JL_sottotitolo = new JLabel(sottotitolo);
            JL_descrizione_1 = new JLabel(descrizione_1);
            pannello1.setLayout(new GridLayout(3,0));
            pannello1.add(JL_titolo);
            pannello1.add(JL_sottotitolo);
            pannello1.add(JL_descrizione_1);
            getContentPane().add(pannello1, BorderLayout.NORTH);
    ma avevo riscontrato due problemi:

    1) Non riesco a mettere al centro le stringhe di testo
    2) Non riesco a settare un bordo ma posso risolvere aggiungendo delle stringhe vuote
    Ultima modifica di giannino1995; 08-01-2014 a 13:44

  4. #4
    Ho risolto con le funzionalità di JLabel... ammazza quante ce ne sono!!

    Grazie ancora andbin
    Ultima modifica di giannino1995; 08-01-2014 a 14:10

  5. #5
    Scusate se rompo dinuovo le scatole ma non riesco proprio a capire come funziona questo setBorder e perché lo JScrollPane non aggiunge le barre di scorrimento come piacciono a me. L'interlinea che c'è tra le 3 stringhe che vedete sotto è troppo grande e se setto a 0 i bordi con EmptyBorder non riesco a ridurla.
    Per quanto riguarda JScrollPane vorrei applicare una barra di scorrimento solo verticale a un JPanel che contiene altri JPanel tutti quanti settati con FlowLayout. Il mio problema è che non resco a settare una barra di scorrimento verticale, java me la mette sempre e solo orizzontale.
    JPanel jp = new JPanel();
    JScrollPane jsp = new JSrollPane(jp);
    Ho provato le 1200 soluzioni prese da google ma non c'è stato verso...

    Ecco qui uno stralcio del codice...

    codice:
    import java.awt.BorderLayout;
    import java.awt.ComponentOrientation;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    
    import javax.swing.*;
    import javax.swing.border.EmptyBorder;
    
    public class InterfacciaGraficaVotazioni extends JFrame {
    
    ...
    
    private EmptyBorder bordi = new EmptyBorder(0, 0, 0, 0);
    
    ...
    
    private void actionExit() {
            System.exit(0);
        }
    
    public InterfacciaGrafica() {
            
    ...
    
    menu_file.add(comando_exit);
            barra_menu.add(menu_file);
            setJMenuBar(barra_menu);
            // Creazione dell'intestazione della finestra
            JPanel pannello1 = new JPanel();
            pannello1.setBorder(bordi);
            JL_titolo = new JLabel(titolo);
            JL_sottotitolo = new JLabel(sottotitolo);
            JL_descrizione_1 = new JLabel(descrizione_1);
            pannello1.setLayout(new GridLayout(6, 1));
            // Riga 1, 2, 3
            JL_titolo.setHorizontalAlignment(SwingConstants.CENTER);
            JL_titolo.setBorder(bordi);
            pannello1.add(JL_titolo);
            JL_sottotitolo.setHorizontalAlignment(SwingConstants.CENTER);
            JL_sottotitolo.setFont(carattere);
            pannello1.add(JL_sottotitolo);
            JL_descrizione_1.setHorizontalAlignment(SwingConstants.CENTER);
            JL_descrizione_1.setFont(carattere);
            pannello1.add(JL_descrizione_1);
            // Riga 4
            JPanel pannello2 = new JPanel();
            pannello2.setLayout(new FlowLayout());
            JL_nota_1 = new JLabel(nota_1);
            pannello2.add(JL_nota_1);
            JTF_nomefile = new JTextField(nomefile, lunghezza_nomefile);
            pannello2.add(JTF_nomefile);
            JB_inizializza = new JButton(inizializza);
            pannello2.add(JB_inizializza);
            pannello1.add(pannello2);
            // Riga 5
            JPanel pannello3 = new JPanel();
    
         ...
            
        }
    
        // Avvia il software
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
    InterfacciaGrafica interfaccia = new InterfacciaGrafica();
                    interfaccia.setVisible(true);
                }
            });
        }
    }

  6. #6
    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
    non riesco proprio a capire come funziona questo setBorder
    Semplice: ogni componente Swing può avere 1 Border, che può essere un bordo basilare (es. EmptyBorder, LineBorder) o un bordo "composto" (CompoundBorder). Tutto qui.
    Ah, le classi specifiche dei bordi si possono anche istanziare direttamente ma in genere è preferibile usare le factory in BorderFactory.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    perché lo JScrollPane non aggiunge le barre di scorrimento come piacciono a me.
    Nel codice postato non c'è traccia del JScrollPane. Comunque la gestione delle scrollbar è già automatica. Ma nota che il componente da scrollare (es. JTextArea, JTable ...) lo devi mettere come "view" in JScrollPane ed è poi JScrollPane (non il componente) che devi aggiungere nel tuo layout.
    Se vuoi cambiare le policy di visualizzazione delle 2 scrollbar, JScrollPane ha costruttori/metodi appositi.

    Quote Originariamente inviata da giannino1995 Visualizza il messaggio
    L'interlinea che c'è tra le 3 stringhe che vedete sotto è troppo grande e se setto a 0 i bordi con EmptyBorder non riesco a ridurla.
    Per quanto riguarda JScrollPane vorrei applicare una barra di scorrimento solo verticale a un JPanel che contiene altri JPanel tutti quanti settati con FlowLayout. Il mio problema è che non resco a settare una barra di scorrimento verticale, java me la mette sempre e solo orizzontale.
    Senza poter vedere (e provare) del codice compilabile .... mi è difficile capire cosa ottieni ora e soprattutto cosa vuoi fare ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Ho provato anche questa strada ma non ho visto nessun tipo di barra:

    codice:
    JScrollPane jsp = new JScrollPane(jpanelpannello);
            jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    add(jsp);
    getContentPane().add(jpanelpannello, BorderLayout.CENTER);

  8. #8
    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
    codice:
    JScrollPane jsp = new JScrollPane(jpanelpannello);
            jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    add(jsp);
    getContentPane().add(jpanelpannello, BorderLayout.CENTER);
    Infatti .... al 99,99% ho sempre quel sospetto, perché la maggior parte delle persone sbaglia su questo aspetto.

    jpanelpannello è già come "view" in JScrollPane. jpanelpannello non lo devi più aggiungere ad un tuo altro contenitore!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    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().

  10. #10
    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.