Caricamento di immagini multiple
DOMANDA:
Come posso caricare immagini multiple in un'interfaccia grafica Java?
RISPOSTA:
Prendendo spunto dalla domanda fatta nel post Caricamento di immagini, vi mostrerò ora come caricare immagini multiple. Le differenze sono sostanzialmente nella creazione di un oggetto Immagine dedicato ed alla gestione di un numero dinamico di immagini.
Vediamo la nuova classe Immagine.java:
Vediamo la nuova classe Immagine.java:
package immagini;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class Immagine {
private static long count = 0;
private long id;
private BufferedImage image;
private int x;
private int y;
// "imagePath" è il path dell'immagine da caricare
// x e y sono le coordinate dell'immagine
public Immagine(String imagePath, int x, int y) {
this.image = loadImage(imagePath);
this.x = x;
this.y = y;
this.id = count++;
}
// il parametro "path" è il path dell'immagine da caricare
private BufferedImage loadImage(String path) {
BufferedImage bimg = null;
BufferedImage ret = null;
try {
bimg = ImageIO.read(new File(path));
} catch (Exception e) {
e.printStackTrace();
}
ret = new BufferedImage(bimg.getWidth(), bimg.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = ret.createGraphics();
g.drawImage(bimg, 0, 0, null);
g.dispose();
return ret;
}
public static long getCount() {
return count;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class Immagine {
private static long count = 0;
private long id;
private BufferedImage image;
private int x;
private int y;
// "imagePath" è il path dell'immagine da caricare
// x e y sono le coordinate dell'immagine
public Immagine(String imagePath, int x, int y) {
this.image = loadImage(imagePath);
this.x = x;
this.y = y;
this.id = count++;
}
// il parametro "path" è il path dell'immagine da caricare
private BufferedImage loadImage(String path) {
BufferedImage bimg = null;
BufferedImage ret = null;
try {
bimg = ImageIO.read(new File(path));
} catch (Exception e) {
e.printStackTrace();
}
ret = new BufferedImage(bimg.getWidth(), bimg.getHeight(),
BufferedImage.TYPE_INT_ARGB);
Graphics2D g = ret.createGraphics();
g.drawImage(bimg, 0, 0, null);
g.dispose();
return ret;
}
public static long getCount() {
return count;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Vediamo ora come si è snellito Pannello.java che ha acquisito un comportamento più coeso:
package immagini;
import java.awt.Graphics;
import javax.swing.JPanel;
public class Pannello extends JPanel {
private static final long serialVersionUID = 1L;
private Immagine[] immagini;
public Pannello(Immagine[] immagini) {
this.immagini = immagini;
}
public void paintComponent(Graphics g) {
for(Immagine i : immagini)
g.drawImage(i.getImage(), i.getX(), i.getY(), this);
repaint();
}
}
import java.awt.Graphics;
import javax.swing.JPanel;
public class Pannello extends JPanel {
private static final long serialVersionUID = 1L;
private Immagine[] immagini;
public Pannello(Immagine[] immagini) {
this.immagini = immagini;
}
public void paintComponent(Graphics g) {
for(Immagine i : immagini)
g.drawImage(i.getImage(), i.getX(), i.getY(), this);
repaint();
}
}
La classe Finestra.java è rimasta simile, cambia la presenza di un array di Immagine:
package immagini;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Finestra extends JFrame {
private static final long serialVersionUID = 1L;
public Finestra( ) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGUI(600, 600);
}
});
}
private void createGUI(int frameDimX, int frameDimY) {
this.setSize(frameDimX + 16,frameDimY + 34); // 16,34 = bordi della finestra
Immagine[] immagini = new Immagine[3];
immagini[0] = new Immagine("C:/1.jpg", 20, 20);
immagini[1] = new Immagine("C:/2.png", 70, 70);
immagini[2] = new Immagine("C:/3.png", 0, 120);
this.getContentPane().add(new Pannello(immagini));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class Finestra extends JFrame {
private static final long serialVersionUID = 1L;
public Finestra( ) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createGUI(600, 600);
}
});
}
private void createGUI(int frameDimX, int frameDimY) {
this.setSize(frameDimX + 16,frameDimY + 34); // 16,34 = bordi della finestra
Immagine[] immagini = new Immagine[3];
immagini[0] = new Immagine("C:/1.jpg", 20, 20);
immagini[1] = new Immagine("C:/2.png", 70, 70);
immagini[2] = new Immagine("C:/3.png", 0, 120);
this.getContentPane().add(new Pannello(immagini));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}
Ed infine la classe di Test.java che è rimasta identica:
package immagini;
public class Test {
public static void main(String[] args) {
new Finestra();
}
}
public class Test {
public static void main(String[] args) {
new Finestra();
}
}
come faccio a far camminare il mio sfondo
RispondiEliminacome faccio a far camminare il mio sfondo.grazie mille
RispondiEliminaIl tuo esempio funziona alla perfezione.
RispondiEliminaPur lavorando con 3 panel è anche molto semplice e quindi l'ideale per chi sta iniziando.
Stavo cercando di introdurre la modifica successiva delle 3 immagini ma finora sono solo riuscito a creare altri 3 panel con altre 3 immagini.
Io invece vorrei solo creare un metodo per modificare le immagini già presenti con altre 3.
Giuseppe, puoi darmi qualche consiglio o esempio?
Grazie