Immagine di background ripetuta

di il
1 risposte

Immagine di background ripetuta

Buonasera.
Ho rispolverato una vecchia classe che consente di impostare un'immagine di sfondo ad un JFrame.
Vorrei però che, data una piccola immagine, essa ricopra l'intera finestra, replicandosi in automatico in modo da dare l'illusione che si tratti di un'unica grande immagine. Al momento, invece, appare l'immagine nella sua dimensione reale ed il resto dello spazio rimane completamente bianco. Allego codice della classe.

import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JPanel;


public class DemoBackgroundSwing extends JPanel {
	private static String path;
	private Image img;

	public DemoBackgroundSwing() {
		img = Toolkit.getDefaultToolkit().createImage(path);
		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 String getPath() {
		return path;
	}
	public static void setPath(String path) {
		DemoBackgroundSwing.path = path;
	}
}

1 Risposte

  • Re: Immagine di background ripetuta

    PinoCampagna ha scritto:


    Vorrei però che, data una piccola immagine, essa ricopra l'intera finestra, replicandosi in automatico in modo da dare l'illusione che si tratti di un'unica grande immagine. Al momento, invece, appare l'immagine nella sua dimensione reale ed il resto dello spazio rimane completamente bianco.
    Innanzitutto il setOpaque(false) non va bene e non va fatto nel paintComponent.
    Riguardo il riempimento in modalità "tiling" (cioè "piastrellando" tutto lo spazio con la stessa immagine) semplicemente ... è tutto a carico tuo. Nel paintComponent prendi la dimensione fisica corrente del pannello ( getWidth() , getHeight() ) poi conoscendo la dimensione della immagine fai un doppio ciclo for annidato per ripetere la immagine su tutta la superficie.

    Se arrivi a riempire tutta la superficie, allora il super.paintComponent(g) lo puoi poi anche evitare.

    P.S. il campo "path" static (e la coppia di metodi getPath/setPath) non va bene, non è "object oriented". Meglio passare il path al costruttore.
Devi accedere o registrarti per scrivere nel forum
1 risposte