Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2011
    Messaggi
    4

    JPanel che contiene un altro JPanel: Problemi!!

    Ciao a tutti,
    sto inziando ad imparare ad usare la classe Swing per costruire una GUI (e sto anche iniziando a programmare in Java), quindi vi chiedo aiuto.
    Sto cercando di suddividere la mia GUI in varie sezioni, come se fosse una pagina HTML.
    Quindi ho creato una classe che estende la classe JFrame e all'interno l'ho suddiviso in vari pannelli.
    Il problema è che quando inserisco un pannello in un altro pannello, per costruire la gerarchia, non riesco a vedere il contenuto. Dove sbaglio?

    Di seguito il sorgente:

    package com.zanata.grafica.GUIComplesse;
    import javax.swing.*;
    import javax.swing.ImageIcon;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.*;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class MyFrame extends JFrame{

    //Dichiaro i miei 3 pannelli che comporranno la mia finestra (ho deciso di suddividere in 3 aree la mia finestra)
    //IMAGEPANEL: E'una classe che eredita da JPanel e che mi permette di inserire un'immagine come sfondo
    ImagePanel headerPnl = new ImagePanel(new ImageIcon("c:/pulsanti/Header_Zigrinato_ok.png").getImage());
    ImagePanel centroPnl = new ImagePanel(new ImageIcon("c:/pulsanti/Centro.png").getImage());
    ImagePanel footerPnl = new ImagePanel(new ImageIcon("c:/pulsanti/Footer.png").getImage());

    ImagePanel headerSuPnl = new ImagePanel("");

    //Poi istanzio tutti i componenti che utilizzerò nei miei panel

    ImageIcon imgAccesso = new ImageIcon("c:\\Pulsanti\\Accesso.png");
    JButton pulsanteLogin = new JButton(imgAccesso);
    JLabel lblLettiInVista = new JLabel("Qui ci metto i letti in vista");
    JLabel lblLetti = new JLabel("Qui ci metto i letti normali");
    JLabel lblFooter = new JLabel("Qui ci metto il copyright");


    //Costruttore
    public MyFrame(){
    super("Esempio");
    //HEADER
    headerPnl.setLayout(new GridLayout(2,1));
    //headerSuPnl.setOpaque(false);
    headerSuPnl.setLayout(new GridLayout(1,2));
    headerSuPnl.add(lblLettiInVista);
    headerSuPnl.add(lblLetti);

    //IL PROBLEMA sta qui perchè vorrei che una cella cel mio headerPnl contenesse un altro Panel (headerSuPnl), ma quando eseguo non vedo il contenuto del mio headerSuPnl
    headerPnl.add(headerSuPnl);

    //CENTRO
    //Assegno al pannello centrale un layout di tipo GridLayout
    centroPnl.setLayout(new GridLayout(2,1));
    centroPnl.add(lblLettiInVista);
    centroPnl.add(lblLetti);

    //FOOTER
    //Al pannello sud non assegno alcun layout
    footerPnl.add(lblFooter);

    //Aggiungo al mio frame i pannelli relativamente a nord, sud,ovest
    getContentPane().add(headerPnl,BorderLayout.NORTH) ;
    getContentPane().add(centroPnl,BorderLayout.CENTER );
    getContentPane().add(footerPnl,BorderLayout.SOUTH) ;

    pack();

    setSize(995,660);
    setVisible(true);
    }

    class ImagePanel extends JPanel {
    private Image img;

    public ImagePanel(String img) {
    this(new ImageIcon(img).getImage());
    }

    public ImagePanel(Image img) {
    this.img = img;
    Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
    setPreferredSize(size);
    setMinimumSize(size);
    setMaximumSize(size);
    setSize(size);
    setLayout(null);
    }

    public void paintComponent(Graphics g) {
    g.drawImage(img, 0, 0, null);
    }
    }

    }

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

    Re: JPanel che contiene un altro JPanel: Problemi!!

    Originariamente inviato da zanatas
    codice:
    //IL PROBLEMA sta qui perchè vorrei che una cella cel mio headerPnl contenesse un altro Panel (headerSuPnl), ma quando eseguo non vedo il contenuto del mio headerSuPnl
    		headerPnl.add(headerSuPnl);
    Il tuo pannello headerSuPnl si presume che in quel momento non abbia dimensione tale da vederlo, visto che non ha una immagine valida da cui deduce le dimensioni.

    E inoltre, dovresti anche chiarirti i concetti sulle dimensioni: una cosa sono i preferredSize/minimumSize/maximumSize e un'altra è il size.
    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
    Dec 2011
    Messaggi
    4
    Ciao e grazie per la risposta.

    In realtà il mio obiettivo non era quello di inserirci un'immagine nel headerSuPnl , ma di metterci altri oggetti in modo ordinato. Il fatto è che qualuque oggetto inserisca non riesco a vederlo.

    Quello che logicamente vorrei fare è di suddividere al pagina in tanti JPanel e poi inseririci gli oggetti che voglio nella posizione corretta.

    Hai qualche consiglio su dove andare a guardare per chiarirmi le idee su preferredSize/minimumSize/maximumSize e il size?

    Ciao

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da zanatas
    In realtà il mio obiettivo non era quello di inserirci un'immagine nel headerSuPnl , ma di metterci altri oggetti in modo ordinato.
    Ma il fatto è che hai comunque usato un tuo ImagePanel:

    ImagePanel headerSuPnl = new ImagePanel("");

    Passando "" è come se facessi appunto new ImageIcon("").getImage()

    Questo fa sì che venga creato un oggetto Image di fatto "vuoto", di dimensione tra l'altro -1 x -1. E questa dimensione vai a forzarla sul ImagePanel come preferredSize/maximumSize/minimumSize. (e il setSize non serve perché questo pannello lo metti dentro l'altro ImagePanel che ha un layout manager).

    Quindi questo tuo ImagePanel non ha dimensione, puoi aggiungerci dentro tutte le label che vuoi ma la sua dimensione è ridotta al minimo.

    E infine: headerSuPnl l'hai messo dentro headerPnl che è in NORTH del BorderLayout. Bene: in NORTH e SOUTH viene "rispettato" solo il preferred height. E la altezza "preferita" di headerSuPnl è appunto -1 (che sarà trattato come 0 alla fin fine).
    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
    Dec 2011
    Messaggi
    4
    Ok, faccio un passo indietro.

    Se io volessi creare un Header al quale voglio assegnare uno sfondo e poi all'interno posizionarci vari componenti, è corretta la strada che sto percorrendo?

    Sto diventando matto! E' tutta mattina che ci sto dietro, ma sono entrato nella fase critica: ho la testa in confusione.

    Riesci a darmi qualche dritta?

    Ciao e grazie

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,280
    Originariamente inviato da zanatas
    Ok, faccio un passo indietro.
    Ecco, magari non ho controllato bene io il sorgente ma giusto per sapere: la immagine di headerPnl (quel Header_Zigrinato_ok.png) la vedi?
    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
    Dec 2011
    Messaggi
    4
    Sì la vedo.
    Io vorrei che quell'immagine fosse lo sfondo e sopra ci posiziono altri oggetti.

    Al momento vedo l'immagine ma se ci metto sopra altro non vedo niente, o meglio: continuo a vedere solo l'immagine zigrinata.

    In allegato trovi l'header che devo riuscire a costruire (dimmi se lo vedi).
    Immagini allegate Immagini allegate

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.