Background Image per componenti Java Swing

In questo breve java tips vediamo come impostare uno sfondo in formato immagine ad un JComponent - quindi applicabile a tutti componenti swing tipo JPanel, JDesktopPane, JButton e tutte le altre sottoclassi - In java i formati immagine supportati nativamente sono GIF, JPEG, PNG. Vediamo innanzitutto come caricare un immagine in un oggetto java:
String path = "....";
Image img = Toolkit.getDefaultToolkit().createImage(path);
Questa operazione carica un'immagine da un file residente in locale. Mentre se vogliamo caricare un'immagine che risisede su un webserver possiamo utilizzare la classe java.net.URL:
Image img = Toolkit.getDefaultToolkit().createImage(new URL("http://www.example.com/img.gif"));
La classe atratta Image la superclasse di tutte le classi che rappresentano immagini grafiche di cui il Toolkit di sistema ne crea una concretizzazione in base la formato dell'immagine. Per applicare un'immagine di sfondo dobbiamo ridefinire il metodo paintComponent() di un qualsiasi JComponent. Questo è possbile farlo estendendo la classe oppure più velocemente ricorrere ad una classe anonima, poichè il metodo è protected quindi ridefinibile esclusivamente da una sottoclasse:
public JCustomPanel extends JPanel {
  private Image img;
  ...
  protected void paintComponent(Graphics g) {
    setOpaque(false);
    g.drawImage(img, 0, 0, null);
    super.paintComponent(g);
  }
  ...
}
Per garantire che l'immagine venga caricata in memoria prima di essere utilizzata, possiamo ricorrere alla classe MediaTracker che blocca l'esecuzione del codice fino a quanto l'immagine non viene effettivamente caricata in memoria:
MediaTracker track = new MediaTracker(this);
track.addImage(img, 0);
track.waitForID(0);
Queste sono le tre fasi necessarie per impostare lo sfondo ad un JComponent, ma vediamo come assemblarle in un esempio concreto.

Esempio con un JFrame

Per quanto riguarda un Container, come un JFrame oppure Applet, basta applicare lo sfondo ad un JPanel con il sistema che abbiamo visto ed includerlo nel container swing. Questo è un esempio:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class DemoBackgroundSwing extends JPanel {

  private Image img;

  public DemoBackgroundSwing() {
    img = Toolkit.getDefaultToolkit().createImage("http://www.simplesoft.it/img/example.gif");
    loadImage(img);
  }

  private void loadImage(Image img) {
    try {
      MediaTracker track = new MediaTracker(this);
      track.addImage(img, 0);
      track.waitForID(0);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

  protected void paintComponent(Graphics g) {
    setOpaque(false);
    g.drawImage(img, 0, 0, null);
    super.paintComponent(g);
  }

  public static void main(String... argv) {
    JFrame frame = new JFrame("Demo Background Image");
    DemoBackgroundSwing back = new DemoBackgroundSwing();
    frame.getContentPane().add(back);
    frame.setSize(400, 287);
    frame.setVisible(true);
  }
}
Questo l'output dell'esempio:

Immagine di sfondo per un JFrame

Altri link che potrebbero interessarti
  • Utilizzare un JButton in Java Swing
  • Utilizzare HTML in componenti Java Swing
  • Numeri casuali in java
  • Modalità Full Screen Exclusive in java
  • Leggere un file di testo in java
  • Le variabili atomiche in java
  • Le classi anonime
  • Java Regex
  • Java Database MySql
  • Java Cursor Mouse
  • Import Static Java
  • Implementare un Singleton
  • Implementare un KeyListener in java Swing
  • Implementare il System.out su una JTextArea
  • Il costrutto if in java
  • Il costrutto foreach in java
  • Il blocco static
  • Creare una ToolBar in Java Swing
  • Chiudere le applicazioni Java Swing
  • Bordo con titolo in Java Swing