Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312

    BorderLayout annidati

    Salve a tutti,
    ho un problemino con i layout manager di java. Sostenzialmente ho realizzato un borderLayout. Nei lati dx e sx devo inserire due pulsanti al centro della colonne. Ho scritto questo:


    public Main(){
    layout = new BorderLayout(10,10);
    setLayout(layout);
    left = new JButton("previous");
    left.setPreferredSize(new Dimension(90, 20));
    JPanel leftp = new JPanel();
    leftp.setLayout(new BorderLayout());
    leftp.add(left)
    add(leftp,BorderLayout.WEST);
    Scrivendo così il mio pulsante si estente, in altezza, lungo tutto il layout che lo contiene.
    Se aggiungo un panel semplice nella zona west posso mettere il pulsante al centro di questo panel? Non so come fare

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

    Re: BorderLayout annidati

    Originariamente inviato da lio.b
    Scrivendo così il mio pulsante si estente, in altezza, lungo tutto il layout che lo contiene.
    Perché BorderLayout nelle parti EAST/WEST rispetta solo il "preferred width" del componente. L'altezza è imposta da BorderLayout come l'altezza del contenitore meno l'altezza di NORTH/SOUTH (se presenti).

    Originariamente inviato da lio.b
    Se aggiungo un panel semplice nella zona west posso mettere il pulsante al centro di questo panel? Non so come fare
    Sì, un JPanel ovviamente ti permette di impostare un altro layout manager in quella area.
    Una cosa semplice che puoi fare è usare un BoxLayout "verticale" e mettere 3 componenti: un "glue" (Box.createVerticalGlue()), il tuo pulsante e infine un altro "glue". I due glue si spartiscono lo spazio rimanente al 50% e il tuo pulsante è centrato verticalmente!

    Non è l'unica strada, comunque (si potrebbe usare GridBagLayout).
    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
    Sep 2008
    Messaggi
    312
    Grazie, funziona.
    Il BoxLayout deve essere orizzontale e non verticale.
    Ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Scusami, ma non funziona il caso simile.
    Per la colonna ho fatto così:
    right = new JButton("next");
    Component glue = Box.createVerticalGlue();
    JPanel rightp = new JPanel();
    rightp.setLayout(new BoxLayout(rightp,BoxLayout.X_AXIS));
    rightp.add(glue);
    rightp.add(right);
    rightp.add(glue);
    Non capisco perchè devo allineare lungo le x ma funziona.
    Ora, nel box sud del borderlayout devo inserire una text area ed un pulsante sempre al centro ed ho scritto questo:
    area = new JTextField();
    search = new JButton("serch");
    Component glue2 = Box.createHorizontalGlue();
    JPanel searchp = new JPanel();
    searchp.setLayout(new BoxLayout(searchp,BoxLayout.X_AXIS));
    search.add(glue2);
    searchp.add(search);
    searchp.add(area);
    search.add(glue2);
    Il risultato è che si estende su tutto il box sud e che il bottone search diventa di un'altezza piccolissima rispetto la jtext area. Come se i glue fossero sopra e sotto quel pulsante.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Il BoxLayout deve essere orizzontale e non verticale.
    Non è che "deve" ..... se lo metti verticale devi usare i due "glue", se lo metti orizzontale (e chissà perché non ci avevo pensato quando ti ho risposto! ) va pure bene e anzi meglio, perché si sfrutta il fatto che un BoxLayout orizzontale "rispetta" la proprietà "alignmentY" dei componenti. E siccome l'alignmentY di un JButton è per default 0.5, sta appunto centrato.

    Se con il BoxLayout orizzontale fai: tuoButton.setAlignmentY(0.25f); vedi che non sta più centrato ma più o meno a 1/4.

    Il BoxLayout verticale sarebbe molto comodo se dovessi mettere più componenti magari centrati verticalmente e magari separati da un piccolo spazio, es.: un "glue", un button, uno "strut" di 10 pixel (Box.createVerticalStrut(10)), un button e un "glue". Cosa che con un BoxLayout orizzontale ovviamente non la fai e con un GridBagLayout la fai ma è più tedioso (per i constraints).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    codice:
    rightp.add(glue);
    rightp.add(right);
    rightp.add(glue);
    
    search.add(glue2);
    searchp.add(search);
    searchp.add(area);
    search.add(glue2);
    Non mettere mai lo stesso identico componente in 2 o più posti!!!! (mi riferisco ai glue). Istanzia/ottieni nuovi componenti!!
    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
    Sep 2008
    Messaggi
    312
    Ok, ma resta sempre il problema nel settore sud.
    Sia con dicersi glue non cambia nulla, come ti ho scritto nel post precedente

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Ora, nel box sud del borderlayout devo inserire una text area ed un pulsante sempre al centro ed ho scritto questo:

    Il risultato è che si estende su tutto il box sud e che il bottone search diventa di un'altezza piccolissima rispetto la jtext area. Come se i glue fossero sopra e sotto quel pulsante.
    Questo succede perché BoxLayout prende in considerazione anche il "maximum size" di un componente. E JTextField ha un maximum size enorme, il massimo possibile:

    java.awt.Dimension[width=2147483647,height=2147483647]

    Tale per cui BoxLayout fa in modo che si espanda "al massimo".

    Semplicemente, dopo che hai istanziato il JTextField, puoi prendere il "preferred size" e impostarlo sul "maximum size". E se fai così, devi istanziare il JTextField con un numero di colonne es. new JTextField(10) affinché si imposti ad un certo preferredSize.

    P.S. Se vuoi usare bene i layout manager, devi comprendere bene se, come e dove i layout manager rispettano e usano i vari minimumSize/preferredSize/maximumSize e eventualmente gli alignment X/Y.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2008
    Messaggi
    312
    Scusa, un 'attimo. Stiamo dicendo che impostare la lunghezza della text non funziona in quanto prende quella del box layout. Perchè risolvo dando un numero di colonne alla text area? a me serve solo una riga con un pulsante vicino...

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da lio.b
    Scusa, un 'attimo. Stiamo dicendo che impostare la lunghezza della text non funziona in quanto prende quella del box layout. Perchè risolvo dando un numero di colonne alla text area? a me serve solo una riga con un pulsante vicino...
    Allora non hai capito. BoxLayout prende in considerazione anche il "maximum size" dei componenti. E per JTextField il maximum size è per default una dimensione enorme, la massima possibile.

    Se il BoxLayout è orizzontale ed è nella parte SOUTH di un BorderLayout allora succede questo. BorderLayout nella parte SOUTH rispetta solo il preferred height (non il width) del componente. Il componente è un JPanel con BoxLayout orizzontale. Quindi viene chiesto al BoxLayout quale è il suo preferred height e questo è il maggiore preferred height tra tutti i vari componenti (textfield e pulsante nel tuo caso).

    Ma la larghezza del JTextField dipende solo dal BoxLayout, che vedendo un maximum width enorme, lo espande orizzontalmente al massimo.

    Se istanzi un JTextField indicando un numero di colonne, lui si calcola il giusto preferred size per tali colonne e se questo lo assegni al maximum size, allora risulta dimensionato in un BoxLayout con la dimensione appropriata per il numero di colonne.
    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.