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

    Impostare Sfondo JPanel

    Sono alle prime armi con la programmazione Java ma ho un problema. Sto cercando di sviluppare una rubrica telefonica e sono alla prima schermata (il menù )
    Ho creato i pulsanti che mi servono (Ricerca,Modifica e Cancella) e li ho sistemati tramite Layout annidati.

    Adesso vorrei mettere un immagine di sfondo. Ho fatto un po di prove ad esempio con JLabel e ImageIcon ma pur mettendo il label nel Container e i pulsanti in un altro JPanel, i pulsanti non mi si vedono e si vede solo lo sfondo, se invece tolgo le righe di codice dello sfondo i pulsanti ci sono.
    Come fare? Ho letto qualcosa riguardante un certo Graphics ma non ho capito molto e oltre a fare un copia incolla (che va beh potrebbe andare anche bene per adesso) vorrei proprio capire come si fa...!

    Potete aiutarmi?

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

    Re: Impostare Sfondo JPanel

    Originariamente inviato da SteMito88
    Adesso vorrei mettere un immagine di sfondo. Ho fatto un po di prove ad esempio con JLabel e ImageIcon ma pur mettendo il label nel Container e i pulsanti in un altro JPanel, i pulsanti non mi si vedono e si vede solo lo sfondo, se invece tolgo le righe di codice dello sfondo i pulsanti ci sono.
    Come fare? Ho letto qualcosa riguardante un certo Graphics ma non ho capito molto e oltre a fare un copia incolla (che va beh potrebbe andare anche bene per adesso) vorrei proprio capire come si fa...!
    No, non fare "giochi" strani con JLabel o più pannelli o altro.
    Se vuoi che un JPanel abbia una immagine di sfondo e possa comunque contenere dei componenti, allora devi estendere JPanel per fare un es. TuoPannello dove fai l'override di paintComponent() per disegnare la immagine. E nel tuo pannello ovviamente andranno inseriti i componenti che quindi staranno "sopra" lo sfondo.

    Se ne è già parlato più volte sul forum. E puoi anche vedere tra i miei Java Examples (vedi firma) nella sezione AWT/Swing - Graphics l'esempio TiledBackground.java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Fammi capire... cosa sbaglio???

    import java.awt.*;
    import javax.swing.*;

    class Prova extends JFrame{

    ImageIcon imma = new ImageIcon("tile1.jpg");
    Image imma = imma.getImage();
    JButton button;

    public static void main(String[] args) {
    Prova frame = new Prova();
    frame.setVisible(true);
    }

    public Prova(){

    Container contentPane = getContentPane();

    contentPane.setLayout(new FlowLayout());
    button = new JButton("ciao");
    contentPane.add(button);

    setTitle("CIAO");
    setSize(900,600);
    setLocation(200,150);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public void Paint (Graphics g) {
    super.paint(g);
    g.drawImage(Imma,0,29,this);
    }

    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,283
    Originariamente inviato da SteMito88
    Fammi capire... cosa sbaglio???
    Innanzitutto: 1) Non "citare" il codice che posti ... risulta difficile poi quotarlo. 2) Il codice scrivilo ben indentato e postalo tra i tag CODE.

    Tornando al tuo codice: sicuramente così come è non può compilare. Hai dichiarato 2 variabili di istanza con lo stesso nome 'imma'.

    E comunque non è così che dovresti fare e non è questo che dicevo io. Tu stai tentando di fare l'override di paint() del JFrame. A parte che hai sbagliato, perché hai scritto Paint e quindi non è certo un override. Ma in ogni caso non è l'approccio corretto. JFrame è un componente complesso, non si dovrebbe fare l'override di paint.

    Crea una "tua" classe che estende JPanel, fai l'override di paintComponent() e disegna la immagine. Fai naturalmente prima anche la invocazione con super di paintComponent().
    Quindi metti una istanza di questo "tuo" pannello dentro un JFrame. E ripeto: c'è il mio esempio TiledBackground.java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    L'ho guardato il tuo codice ma onestamente ci capisco poco.. sono proprio alle prime armi e non riesco a distinguere cià che interessa a me con ciò che non mi interessa... adesso riprovo.. ma fare l'override cosa significa?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,283
    Originariamente inviato da SteMito88
    L'ho guardato il tuo codice ma onestamente ci capisco poco..
    Riducendo ai minimi termini:

    codice:
    class PannelloSfondo extends JPanel {
        private Image imgSfondo;
    
        public PannelloSfondo(Image imgSfondo) {
            super(new BorderLayout());
            this.imgSfondo = imgSfondo;
        }
    
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(imgSfondo, 0, 0, this);
        }
    }
    Istanzia un PannelloSfondo passando la immagine. Settalo come content pane del frame con tuoFrame.setContentPane(tuoPannelloSfondo); (tuoFrame può anche essere il this implicito se una tua classe estende JFrame). A questo punto il tuo pannello è il content pane.

    Cambia eventualmente layout manager del content pane e aggiungi i componenti nel content pane.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ma perchè sembra semplicissimo quando lo spieghi tu e poi non mi compila??
    Ho anche provato a mettere "PannelloSfondo sfondo = new PannelloSfondo("tile1.jpg");" tutto subito sotto "class Prova extends JFrame{" e toglierlo da "public Prova(){" ma rimane l'errore...


    codice:
     import java.awt.*;
     import javax.swing.*;
     
    class Prova extends JFrame{
    	
    	PannelloSfondo sfondo;
    	JButton button;
    	JPanel pannellosopra;
       
        public static void main(String[] args) {
        	Prova frame = new Prova();
        	frame.setVisible(true);
        }
        
        public Prova(){
    
        	Container contentPane = getContentPane();
        	this.setContentPane(sfondo);                
        	sfondo = new PannelloSfondo("tile1.jpg");     //dice che il problema è qui
        	
        	button = new JButton("ciao");
        	pannellosopra.add(button);
        	
        	setTitle("CIAO");
        	setSize(900,600);
        	setLocation(200,150);
        	setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
        
        
    	class PannelloSfondo extends JPanel{
    		
    		Image imgsfondo;
    		
    		public PannelloSfondo(Image imgsfondo) {
    			super(new BorderLayout());
    			this.imgsfondo = imgsfondo;
            }
    
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(imgsfondo, 0, 0, null);
    	}
    	}
    }

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,283
    Originariamente inviato da SteMito88
    Container contentPane = getContentPane();
    this.setContentPane(sfondo);
    sfondo = new PannelloSfondo("tile1.jpg"); //dice che il problema è qui
    A che ti serve prendere prima il vecchio content pane??
    Se PannelloSfondo lo istanzi dopo che hai fatto il setContentPane (dove tra l'altro 'sfondo' è sicuramente null) ... che ti serve??

    Poi il costruttore di PannelloSfondo riceve un Image .... e tu passi un String!!! Non ha senso e ovviamente non compila.

    E 'pannellosopra' dove lo inizializzi?? (non vedo ....) E sopratutto ... a cosa ti serve??

    No, mi spiace. Riscrivi tutto con un po' di buon senso ....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    ok allora pannellosopra lo volevo perchè poi nel vero file voglio dei Layout sopra il contentPane e questo è giusto di prova...

    Capisco il tuo ragionamento quando dici che il costruttore di PannelloSfondo riceve un immagine e io gli passo una string... ma come faccio per metterlo a posto?

    Invece il Container contentPane = getcontentPane(); l'ho messo perchè tutti in tutti gli esempi che fa il mio libro c'è e pensavo fosse una sorta di costante...

    Purtroppo questo libro insegna benissimo il linguaggio Java senza Frame e oggetti GUI e c'è solo un capitolo (quello finale) su queste cose.. quindi sono un po spaesato... è per quello che faccio errori stupidi.. devo trovare una libro su cui studiare...

    comunque venendo a noi... Come faccio a fargli passare un immagine e non una string?

    Ti riposto il codice che dovrebbe avere solo quest'ultimo errore...

    codice:
    import java.awt.*;
     import javax.swing.*;
     
    class Prova extends JFrame{
    	
    	PannelloSfondo sfondo;
    	JButton button;
    	JPanel pannellosopra;
       
        public static void main(String[] args) {
        	Prova frame = new Prova();
        	frame.setVisible(true);
        }
        
        public Prova(){
    
            sfondo = new PannelloSfondo("tile1.jpg");
        	this.setContentPane(sfondo);
        	
        	button = new JButton("ciao");
        	pannellosopra = new JPanel();
        	pannellosopra.add(button);
        	
        	setTitle("CIAO");
        	setSize(900,600);
        	setLocation(200,150);
        	setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
        
        
    	class PannelloSfondo extends JPanel{
    		
    		Image imgsfondo;
    		
    		public PannelloSfondo(Image imgsfondo) {
    			super(new BorderLayout());
    			this.imgsfondo = imgsfondo;
            }
    
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(imgsfondo, 0, 0, null);
    	}
    	}
    }

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,283
    Originariamente inviato da SteMito88
    Capisco il tuo ragionamento quando dici che il costruttore di PannelloSfondo riceve un immagine e io gli passo una string... ma come faccio per metterlo a posto?

    Come faccio a fargli passare un immagine e non una string?
    La immagine la devi ovviamente "caricare" e le possibilità sono diverse:

    a) Usi un ImageIcon e poi ne prendi il suo Image interno (tra l'altro ... avevi già fatto così!!) E oltretutto nessuno ti vieterebbe di mettere un costruttore in PannelloSfondo che riceve o già un ImageIcon oppure un String con il filename (e ci pensa il costruttore a caricare la immagine). Insomma ... chi/dove deve caricare la immagine lo scegli tu!

    b) Usi uno dei read() della classe javax.imageio.ImageIO.

    c) Usi il getImage() di java.awt.Toolkit.

    Originariamente inviato da SteMito88
    Ti riposto il codice che dovrebbe avere solo quest'ultimo errore...
    Ma c'è ancora quel 'pannellosopra' che sebbene istanzi e assegni un JPanel .... non lo inserisci da nessuna parte!! Insomma ... hai un JPanel con dentro un JButton ma il pannello è lì da solo, non è messo dentro "qualcosa".
    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.