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

    [Java] Problema dimensione JPanel

    nel JFrame ho due JPanel affiancati.
    quello di sinistra ha una larghezza fissa, mentre quello di destra dovrebbe allargarsi fino alla fine del JFrame.
    sul JFrame ho settato l'opzione setExtendedState(JFrame.MAXIMIZED_BOTH);
    il problema è che il JPanel di destra trasborda.
    come posso fare??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    setExtendedState() non c'entra nulla. Quello serve a definire il comportamento della finestra (massimizzata, minimizzata, massimizzata orizzontalmente o verticalmente, ecc).

    Quello che devi fare è scegliere un LayoutManager e usare opportunamente il setPreferredSize() dei componenti.

    Per quello che vuoi ottenere, è sufficiente il BorderLayout. Al WEST metti il JPanel con setPreferredSize() di dimensione fissa, al CENTER metti quello che si deve adattare allo spazio rimanente.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    uhm....il "problema" è che la costruendo con netbeans e il layout manager.
    avevo pensato di impostare la dimensione sottraendo la dimensione del JFrame a quella del JPanel di sinistra che dimensione fissa.
    però nn ha funzionato un granchè.
    secondo te come soluzione è fattibile??

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da fermat
    uhm....il "problema" è che la costruendo con netbeans e il layout manager.
    Usare NetBeans per programmare non dovrebbe essere un problema: chi comanda sei sempre tu, non l'ambiente di sviluppo.
    I LayoutManager si usano sempre, non c'entra l'ambiente di sviluppo. Ed infatti ti ho consigliato ti usare il BorderLayout.

    avevo pensato di impostare la dimensione sottraendo la dimensione del JFrame a quella del JPanel di sinistra che dimensione fissa.
    però nn ha funzionato un granchè.
    secondo te come soluzione è fattibile??
    Non mi pare una soluzione corretta... almeno non quando questo lavoro lo può già fare il LayoutManager per te.

    Bastano davvero pochissime righe per ottenere il risultato. Questo qui sotto è un esempio completo, funzionante e avviabile.

    codice:
    import java.awt.*;
    import javax.swing.*;
    
    public class MiaFinestra extends JFrame {
    
       private JPanel pannelloSinistro;
       private JPanel pannelloDestro;
    
       public MiaFinestra() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          // Creo il pannello sinistro di dimensione fissa
          pannelloSinistro = new JPanel();
    
          // Imposto la dimensione fissa
          pannelloSinistro.setPreferredSize( new Dimension(200, 600) );
    
          // ... e i colori
          pannelloSinistro.setOpaque( true );
          pannelloSinistro.setBackground( Color.GREEN.darker() );
    
          // Questo il pannello "variabile"
          pannelloDestro = new JPanel();
          pannelloDestro.setOpaque( true );
          pannelloDestro.setBackground( Color.BLUE );
    
          // Li aggiungiamo alla finestra
          c.add(pannelloSinistro, BorderLayout.WEST);
          c.add(pannelloDestro, BorderLayout.CENTER);
    
          setResizable( true );
          setTitle("Finestra di prova");
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setSize(800, 600);
          setVisible( true );
       }
    
       public static void main(String[] args) {
          MiaFinestra mf = new MiaFinestra();
       }
    }
    Puoi ridimensionare la finestra come ti pare: il pannello verde avrà sempre la stessa larghezza (200 px).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    ok però ho ancora un problema.
    dentro al JPanel di destra si alternano altri JPanel a seconda della voce di menu scelta.
    il problema è che il JPanel che sta dentro a quello di destra è sempre più grande e quindi strasbroda lo stesso.
    il pannello di destra si chiama panelContainer e quello dentro che strasborda si chiama panelTable.
    io ho provato a fare così:
    codice:
    panelTable.setPreferredSize(new Dimension(panelContainer.getSize().width, panelContainer.getSize().height));
    ma nn ha funzionato.
    secondo te come posso dirgli che deve avere la stessa dimensione del pannello contenitore?

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Dipende sempre dal LayoutManager usato nel contenitore e da quanto è "accondiscendente" il contenuto.
    Che LayoutManager hai usato per il pannello "panelTable"? E come hai impostato (se l'hai fatto) le dimensioni del contenuto?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    allora.
    panelTable sta dentro panelContainer.
    panelContainer ha un borderlayout.
    panelTable ha impostate la misura così:
    codice:
    panelTable.setPreferredSize(new Dimension(panelContainer.getSize()));
    e penso che fino a qui sia tutto ok.
    dentro panelTable ci stanno vari componenti:
    -jtextfield
    -jbutton
    -jscrollpane

    quest'ultimo mi serva per la jtable.
    come layout ho impostato il free layout.
    le dimensioni del jscrollpane e della jtabel le ho impostate così:
    codice:
    jScrollPane1.setPreferredSize(new Dimension(panelTable.getSize().width, 10));
    tableData.setPreferredSize(new Dimension(jScrollPane1.getSize()));

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Allora: se si usa un BorderLayout, ha senso impostare delle dimensioni per i suoi componenti (siano essi pannelli o veri e propri componenti) solo se questi sono posizionati nei bordi (NORTH, EAST, SOUTH o WEST). Per il CENTER non ha senso in quanto è il componente che si adatta in base alle dimensioni della finestra (ad occupare tutto lo spazio rimanente).

    Detto questo, non ha senso impostare una dimensione per panelContainer (e tu giustamente non lo fai). Però se panelContainer è gestito da un BorderLayout, vale la stessa regola per tutti i suoi componenti.

    Né ha alcun senso impostare come dimensione di un componente, la dimensione del suo contenitore, per alcuni motivi:

    1) La dimensione del contenitore dovrà per forza essere maggiore del suo contenuto
    2) Se c'è un LayoutManager, sarà lui a impostare la dimensione dei componenti qualora esso sia richiesto e qualora essi siano accondiscendenti (a maggior ragione per i componenti messi nel CENTER di un contenitore gestito da BorderLayout).

    Mi rimane ora da capire come sono disposti i componenti dentro a panelContainer e panelTable.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    allora.
    dentro panelContainer c'è solo panelTable (o altri JPanel a seconda della voce di menu cliccata, ma gli altri nn danno problemi).
    dentro panelTable per ora ho impostato il Free Layout che è quello predefinito da netbeans.
    il problema secondo me è la JTable che si allarga troppo e trasborda.

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ok.
    FreeLayout è un LayoutManager fornito da NetBeans che mi pare permetta una gestione dei componenti vicina a quella del layout nullo, ma con alcune facilitazioni... pesante e mai usato in vita mia.

    Generalmente se devo visualizzare delle JTable io sfrutto sempre il BorderLayout, inserendo nel suo CENTER il JScrollPane che la contiene. Questo mi garantisce che la tabella si adatti automaticamente alle dimensioni della mia finestra. Poi aggiungo eventuali controlli nei bordi (ad esempio, se ho bisogno di campi di filtro li metto nel NORTH, se ho bisogno di pulsanti che agiscono sul record selezionato li metto nel EAST o nel WEST, i pulsanti di conferma o di azione li metto sempre nel SOUTH.

    codice:
    JPanel pannello = new JPanel( new BorderLayout() );
    JTable tabella = new JTable( ... );
    JScrollPane jsp = new JScrollPane( tabella );
    ...
    pannello.add(jsp, BorderLayout.CENTER);
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.