Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543

    JFrame override setBackground()

    Ciao ragazzi...ho questo codice molto semplice e mi succede una cosa che non riesco a capire...chi mi dà delle delucidazioni?
    codice:
    public class Window extends JFrame{
    	private JPanel container;
    	public Window(String t){
    		super(t);
    		this.container = (JPanel) this.getContentPane();
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.toFront();
    	}
    	public void setIcon(String imgPath){
    		this.setIconImage(Toolkit.getDefaultToolkit().getImage(imgPath));
    		this.setSize((int)Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2, (int)Toolkit.getDefaultToolkit().getScreenSize().getHeight()/2);
    	}
    	public void maximize(){
    		this.setExtendedState(Frame.MAXIMIZED_BOTH);
    	}
    	public void addBackgroundImage(String imgPath){
    		this.container.add(new JLabel(new ImageIcon(imgPath)));
    	}
    	public void setProva(){
    		this.container.add(new JLabel("Prova"));
    	}
    	public void setBackground(Color c){
    		System.out.println(container.toString());
    	}
    }
    
    -------------------------------------------------
    
    public class TestFrame{
    	public static void main(String[] s){
    		Window w = new Window("Titolo");
    		w.setProva();
    		w.maximize();
    		w.setVisible(true);
    	}
    }
    Il problema è che se nel metodo setBackground utilizzo un richiamo al campo container ricevo un'eccezione:
    codice:
    Exception in thread "main" java.lang.NullPointerException
    	at Window.setBackground(Window.java:39)
    	at javax.swing.JFrame.frameInit(Unknown Source)
    	at javax.swing.JFrame.<init>(Unknown Source)
    	at Window.<init>(Window.java:19)
    	at TestFrame.main(TestFrame.java:5)
    e non riesco a capire il motivo

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  2. #2
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    illuminazione....trovato!
    praticamente il metodo viene chiamato dal costruttore (credo) e ho aggiunto questo controllo
    codice:
    	public void setBackground(Color c){
    		super.setBackground(c);
    		if(!c.equals(new Color(238, 238, 238))) this.container.setBackground(c);
    	}
    ora funziona come vorrei

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

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

    Re: JFrame override setBackground()

    Originariamente inviato da oronze
    codice:
    	public void setBackground(Color c){
    		System.out.println(container.toString());
    	}
    Il tuo setBackground() è un "override" di quello in java.awt.Component. Evitalo ... non farlo.

    E il motivo lo scopri benissimo dallo stack trace che hai postato. Quando invochi il costruttore del tuo Window, viene invocato il costruttore di JFrame, che per tua sfortuna invoca setBackground() per impostare un valore di default.
    Ma viene eseguito il "tuo" setBackground e in quel momento il tuo campo 'container' è null!!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543

    Re: Re: JFrame override setBackground()

    Originariamente inviato da andbin
    Il tuo setBackground() è un "override" di quello in java.awt.Component. Evitalo ... non farlo.

    E il motivo lo scopri benissimo dallo stack trace che hai postato. Quando invochi il costruttore del tuo Window, viene invocato il costruttore di JFrame, che per tua sfortuna invoca setBackground() per impostare un valore di default.
    Ma viene eseguito il "tuo" setBackground e in quel momento il tuo campo 'container' è null!!
    ma con la soluzione che ho postato posso farlo? in realtà faccio un check su Color c prima...per il momento non mi sta dando problemi!

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

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

    Re: Re: Re: JFrame override setBackground()

    Originariamente inviato da oronze
    ma con la soluzione che ho postato posso farlo? in realtà faccio un check su Color c prima...per il momento non mi sta dando problemi!
    Ma non è molto bello .... primo, hai testato un colore ben preciso (chi ti dice che sia sempre quello il default??) e secondo, usi this.container che è comunque null quando il tuo metodo viene invocato durante la fase di costruzione di JFrame.

    Se il tuo obiettivo è quello di crearti una classe "base" per una finestra che abbia una API "espansa" e qualche funzionalità in più .... ok, va bene ovviamente. Ma allora espandi appunto la API mettendo ad esempio un metodo setContentBackground().
    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 oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543

    Re: Re: Re: Re: JFrame override setBackground()

    Originariamente inviato da andbin
    Ma non è molto bello .... primo, hai testato un colore ben preciso (chi ti dice che sia sempre quello il default??) e secondo, usi this.container che è comunque null quando il tuo metodo viene invocato durante la fase di costruzione di JFrame.

    Se il tuo obiettivo è quello di crearti una classe "base" per una finestra che abbia una API "espansa" e qualche funzionalità in più .... ok, va bene ovviamente. Ma allora espandi appunto la API mettendo ad esempio un metodo setContentBackground().
    era decisamente quella l'intenzione...solo che non mi piaceva il nome setContentBackground() poichè tutti i componenti hanno solo il più immediato setBackground()...in ogni caso ascolterò il tuo consiglio e cambierò il nome in setWindowBackground()

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

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.