Inserire una GIF come sfondo di un JPanel

di il
3 risposte

Inserire una GIF come sfondo di un JPanel

Buonasera, so che è possibile inserire una GIF come sfondo di un JPanel, ho provato con Image e ImageIcon ma nulla.
Avete qualche suggerimento?

3 Risposte

  • Re: Inserire una GIF come sfondo di un JPanel

    phi ha scritto:


    Buonasera, so che è possibile inserire una GIF come sfondo di un JPanel, ho provato con Image e ImageIcon ma nulla.
    Si deve estendere JPanel e poi ridefinire il

    protected void paintComponent(Graphics g)

    Come prima cosa si dovrebbe invocare super.paintComponent(g);
    Poi si può disegnare altro (es. una immagine).
    Ovviamente va fatto tutto accuratamente e efficientemente (una cosa che ad esempio NON va fatta lì dentro: il caricamento della immagine).

    Poi il pannello potrebbe essere usato per contenere altri componenti, e
    i disegni fatti nel paintComponent stanno sempre "sotto" quei componenti.
  • Re: Inserire una GIF come sfondo di un JPanel

    Si certo, ero già al corrente del tutto. Ho già esteso una classe con JPanel e ridefinito il metodo "paintComponent", la mia domanda era diversa, era come "inserire" una GIF, cioè quale "oggetto" usare, visto che sia con Image non riesco.
  • Re: Inserire una GIF come sfondo di un JPanel

    phi ha scritto:


    come "inserire" una GIF, cioè quale "oggetto" usare, visto che sia con Image non riesco.
    Dipende cosa hai caricato e con quale API.
    - un java.awt.Image dal Toolkit di AWT
    - un java.awt.image.BufferedImage dalla API ImageIO (javax.imageio.ImageIO)
    - un Icon (di norma un javax.swing.ImageIcon)

    Il punto è che il Toolkit di AWT (e anche ImageIcon che sfrutta internamente il Toolkit) carica la immagine in modo "asincrono", quindi NON è tutta disponibile subito. Pertanto quando si fa il g.drawImage( ..... ) si DEVE specificare un ImageObserver

    es. (ma vale anche per gli altri overload):
    drawImage(Image img, int x, int y, ImageObserver observer)

    Ovvero si deve passare come observer lo stesso componente su cui si sta disegnando. Quindi nella classe che estende JPanel:

    g.drawImage( ..... , this);


    BufferedImage invece è una immagine completamente in memoria e viene caricata dalla ImageIO in modo sincrono.
Devi accedere o registrarti per scrivere nel forum
3 risposte