Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    315

    [Swing] Corretta size di un JPanel

    Ho bisogno del consiglio di qualcuno di voi esperto di swing.

    Praticamente ho un panel al cui interno devo mettere una serie di label e textfield.
    Ho messo ogni coppia label/textfield in un pannello contenitore, quindi nel panel esterno ci vanno questi pannelli contenitori.

    Non so quanti pannelli ci vogliono, il numero è variabile. Voglio metterne 4 per riga per poi cominciarne una nuova.

    Il problema è che in base al valore della label, o del text field, le dimensione cambiano e non riesco a trovare un giusto compromesso.

    Qualcuno sa consigliarmi se e quali size fissare e quali no?

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

    Re: [Swing] Corretta size di un JPanel

    Originariamente inviato da koala81
    Praticamente ho un panel al cui interno devo mettere una serie di label e textfield.
    Ho messo ogni coppia label/textfield in un pannello contenitore, quindi nel panel esterno ci vanno questi pannelli contenitori.

    Non so quanti pannelli ci vogliono, il numero è variabile. Voglio metterne 4 per riga per poi cominciarne una nuova.
    La prima questione è che non hai precisato se e quale/i layout manager hai usato o intendi usare.
    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
    Nov 2005
    Messaggi
    315
    Si scusa, hai ragione.

    Dovendo fare questa cosa colonnare, avevo pensato ad un gridbagayout, in modo che ogni 4 pannelli aumento la riga.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da koala81
    Dovendo fare questa cosa colonnare, avevo pensato ad un gridbagayout, in modo che ogni 4 pannelli aumento la riga.
    Ok su questo direi che potrebbe anche andare bene. Ma: il pannello quale layout manager usa per disporre label+textfield?
    Vuoi che label/textfield siano allineate verticalmente nelle righe?

    Per intenderci:

    codice:
    aaa    #######   bb     #######   cccc   #######   ddd    #######
    eeee   #######   fffff  #######   gg     #######   hhhhh  #######
    ?
    Perché sarebbe difficile se non "forzando" delle dimensioni.
    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
    Nov 2005
    Messaggi
    315
    Usa sempre un gridbaglayout a due righe e una colonna, proprio per far venire quello che hai scritto tu.

    Il problema sta nelle dimensioni "da fissare". Voglio che questa struttura sia sempre rispettata e non deve variare se un label ha un testo più lungo di un altro. I pannelli devono rimanere fissi.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da koala81
    Usa sempre un gridbaglayout a due righe e una colonna, proprio per far venire quello che hai scritto tu.
    Ehm, no chiariamo: quello che ho mostrato io sarebbe ogni pannello che ha 2 colonne e 1 riga, non "due righe e una colonna". Se vuoi 2 righe/1 colonna allora le label sarebbero naturalmente "sopra" i textfield.

    Originariamente inviato da koala81
    Il problema sta nelle dimensioni "da fissare". Voglio che questa struttura sia sempre rispettata e non deve variare se un label ha un testo più lungo di un altro. I pannelli devono rimanere fissi.
    Puoi fare in modo che tutti i pannelli abbiano nel GridBagLayout lo stesso "peso".


    Così?

    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class TestFrame extends JFrame {
        private Container contentPane;
        private int idx;
    
        public TestFrame() {
            super("Test Frame");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    
            GridBagLayout gridbag = new GridBagLayout();
    
            contentPane = getContentPane();
            contentPane.setLayout(gridbag);
    
            addPan("aa");
            addPan("bbbbbb");
            addPan("cccc");
            addPan("dddddddddddddd");
            addPan("eeeeeee");
            addPan("ff");
    
            pack();
        }
    
        public void addPan(String labelText) {
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = idx % 4;
            c.gridy = idx / 4;
            c.weightx = 1.0;   // stesso peso per tutti
            add(new LabelTextPanel(labelText), c);
            idx++;
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TestFrame().setVisible(true);
                }
            });
        }
    }
    
    class LabelTextPanel extends JPanel {
        private JLabel label;
        private JTextField textField;
    
        public LabelTextPanel(String labelText) {
            setLayout(new GridBagLayout());
    
            label = new JLabel(labelText);
            textField = new JTextField(15);    // Per la larghezza "preferita"
    
            textField.setMinimumSize(textField.getPreferredSize());
    
            GridBagConstraints c = new GridBagConstraints();
            c.gridx = 0;
            c.gridy = 0;
            c.fill = GridBagConstraints.HORIZONTAL;
    
            add(label, c);
    
            c.gridy = 1;
            add(textField, c);
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2005
    Messaggi
    315
    E si...la questione del peso è fondamentale.

    Ho visto dal tuo codice, che se metto

    codice:
    addPan("ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
    il frame si adatta alle nuove misure, quello che vorrei.

    Se però metto:

    codice:
    setPreferredSize(new Dimension(100, 100 ));
    il frame non si adatta.

    Mi sembra di capire, che basta non settare le preferredSize ai vai contenitori per avere l'effetto desiderato, giusto?

    Inoltre, quando dici:

    codice:
    textField = new JTextField(15);    // Per la larghezza "preferita"
    cosa intendi?
    In ogni caso, se metto un testo lungo alla label la text area si allunga (per il gridbaglayout)

    Grazie dell'aiuto

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.