Vamos a ver cómo abrir una imagen, copiarla en un fichero auxiliar y visualizarla en un jPanel. Esto se emplea cuando queremos por ejemplo ver un logotipo cargado desde un fichero.
- Primero, utilizaremos jFileChooser para hacer la selección del fichero.
- Después, haremos una copia de la imagen para guardarla en un directorio de nuestro interés. (este paso es opcional)
- Por último, visualizaremos la imagen en un jPanel.
Esta es la función que abrirá un diálogo para seleccionar el fichero de imagen a cargar.
final JFileChooser fc = new JFileChooser();
int returnVal = fc.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
try {
String nombreImg = file.getName();
if (nombreImg.endsWith(".jpg")
|| nombreImg.endsWith(".png")
|| nombreImg.endsWith(".bmp")
|| nombreImg.endsWith(".jpeg")) {
File dest = new File(System.getProperty("user.dir") + "/" + nombreImg);
copyFileUsingStream(file, dest);
this.imagen= (dest.getName());
loadImage(dest.getName());
}
} catch (Exception ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(null, "Error abriendo fichero");
}
}
A continuación, la función de copia de imagen de un origen a un destino. Este paso es solamente opcional. En el ejemplo original, me interesó guardar las imágenes que el usuario seleccionaba en un directorio.
private static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
is.close();
os.close();
}
}
Por último, veremos cómo cargar la imagen en un jPanel y poderla visualizar en el panel.
private void loadImage(String name) {
try {
String string = System.getProperty("user.dir") + "/" + name;
ImageIcon ii = new ImageIcon((string));
ImagePanel panel = new ImagePanel(ii.getImage()); // NOI18N
jPanel2.add(panel, BorderLayout.CENTER);
panel.setCustomWidth(jPanel2.getWidth());
panel.setCustomHeight(jPanel2.getHeight());
panel.validate();
panel.repaint();
} catch (Exception e) {
e.printStackTrace();
}
}
** Cabe destacar que el jPanel donde se visualizará la imagen, está con un Layout tipo BORDERLAYOUT. Por este motivo, al añadir la imagen, se tiene el parámetro BorderLayout.CENTER.