Imagenes en JAVA en un JDesktopPane.

22 07 2008

Imagenes en java, es quiza algo muy tedioso. sin embargo, existe formas muy practicas, de como poner una imagen de fondo a tu aplicacion atravez de un JDesktopPane.

Por eso en esta oportunidad mostrare un ejemplo de seleciones de imagenes dentro de un JDesktopPane,

La idea general es impleementar 3 clases(WindowImagenes, ControlaEventos, PintaImagen). La primera clase(WindowImagenes.java) es la interactua con el usuario, mejro dicho la ventana. La segunda clase(ControlaEventos.java), como su mismo nombre, es la encargada de controlar las acciones ocurridas en la ventana. La tercera clase(PintaImagen.java), es la clase que me permite pintar la imagen en algun como componente java (en este caso jDesktopPane).

La primera clase(WindowImagenes), creamos objetos del tipo “File” y le damos la ruta de nuestra imagen.

public File imagen1 = new File ("Images/java.png");

Aqui el fuente de WindowImagenes.java

import javax.swing.*;
import java.io.File;
public class WindowImagenes extends JFrame {

    public WindowImagenes() {
        initComponents();
    }

    private void initComponents() {

        buttonGroup1 = new ButtonGroup();
        jPanel1 = new JPanel();
        jRadioButton1 = new JRadioButton();
        jRadioButton2 = new JRadioButton();
        jRadioButton3 = new JRadioButton();
        jPanel2 = new JPanel();
        jDesktopPane1 = new JDesktopPane();
        jLabel1 = new JLabel();

        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setTitle("http://inforux.wordpress.com");
        getContentPane().setLayout(null);

        jPanel1.setBorder(BorderFactory.createTitledBorder("Selecione la Imagen"));
        jPanel1.setLayout(null);

        jRadioButton1.setText("Imagen 1");
        jPanel1.add(jRadioButton1);
        jRadioButton1.setBounds(30, 20, 83, 23);

        jRadioButton2.setText("Imagen 2");
        jPanel1.add(jRadioButton2);
        jRadioButton2.setBounds(170, 20, 83, 23);

        jRadioButton3.setText("Imagen 3");
        jPanel1.add(jRadioButton3);
        jRadioButton3.setBounds(290, 20, 114, 23);

        /*agregamos al ButtonGroup los JRadioButtons*/
        buttonGroup1.add(jRadioButton1);
        buttonGroup1.add(jRadioButton2);
        buttonGroup1.add(jRadioButton3);
        getContentPane().add(jPanel1);
        jPanel1.setBounds(20, 50, 440, 60);

        jPanel2.setBorder(BorderFactory.createTitledBorder("Imagen en el JDesktopPane"));
        jPanel2.setLayout(null);
        jPanel2.add(jDesktopPane1);
        jDesktopPane1.setBounds(20, 30, 390, 270);

        getContentPane().add(jPanel2);
        jPanel2.setBounds(20, 120, 440, 330);

        jLabel1.setText("DEMO POR INFORUX");
        getContentPane().add(jLabel1);
        jLabel1.setBounds(170, 20, 170, 20);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-488)/2, (screenSize.height-493)/2, 488, 493);
        ControlaEventos controlaEventos =new ControlaEventos(this);
        jRadioButton1.addActionListener(controlaEventos);
        jRadioButton2.addActionListener(controlaEventos);
        jRadioButton3.addActionListener(controlaEventos);
    }

    public static void main(String args[]) {
                new WindowImagenes().setVisible(true);  }

    public File imagen1 = new File ("Images/java.png");
    public File imagen2 = new File ("Images/JavaAnimado.gif");
    public File imagen3 = new File ("Images/JavaLoro.jpg");
    public JRadioButton jRadioButton1;
    public JRadioButton jRadioButton2;
    public JRadioButton jRadioButton3;
    private ButtonGroup buttonGroup1;
    public JDesktopPane jDesktopPane1;
    private JLabel jLabel1;
    private JPanel jPanel1;
    private JPanel jPanel2;
}

La segunda clase,recibe un objeto de la clase q controlara(en este caso WindowImagenes), ademas manejara todos los eventos realizados en la ventana. Por otro lado implementara el metodo “cargarImagen()”, el cual recibe, un JDesktopPane, y el archivo Imagen, luego atravez de la clase ImageIO, podremos leer el archivo, como archivo imagen. para luego agregarlo al jDesktopPane con el metodo “setBorder()”

BufferedImage image = ImageIO.read(fileImagen);        
jDeskp.setBorder(new PintaImagen(image));

Aqui el fuente de ControlaEventos.java

import java.awt.event.*;
import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
public class ControlaEventos implements ActionListener{/*clase escuchadora de nuestra vista*/
    WindowImagenes ventana;/*declaramos un objeto de la clase WindowImagenes*/
    public ControlaEventos(WindowImagenes objeto){
        ventana = objeto;
    }
    public void actionPerformed(ActionEvent evento) 
    {
        if (evento.getSource()== ventana.jRadioButton1)
            cargarImagen(ventana.jDesktopPane1,ventana.imagen1);
        else {
        if (evento.getSource()== ventana.jRadioButton2)
            cargarImagen(ventana.jDesktopPane1,ventana.imagen2);
        else {
        if (evento.getSource()== ventana.jRadioButton3)
            cargarImagen(ventana.jDesktopPane1,ventana.imagen3);
        }
        }
    }
    /*este metodo recibe el jdeskopPane y el archivo imagen*/
    public  void cargarImagen(javax.swing.JDesktopPane jDeskp,File fileImagen)
    {   
        try{   
            BufferedImage image = ImageIO.read(fileImagen);        
              jDeskp.setBorder(new PintaImagen(image)); }
        catch (Exception e){   System.out.println("No cargo imagen, sorry");   }        
    }
}

La ultima clase(PintaImagen.java), es la permite preparar la imagen para ser agregados a un componente en este caso del tipo JDesktopPane, esta debera implementar de la Clase Border, obligandonos a llamar a 3 metodos “paintBorder()”, “getBorderInsets()” y “isBorderOpaque()”.

Aqui el fuente:

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Insets;
import java.awt.image.BufferedImage;
import javax.swing.border.Border;

public class PintaImagen implements Border{

    private   BufferedImage image ;

    public PintaImagen(BufferedImage image ) {
        this.image=image;}

    public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) {
    int x0 = x+ (width-image.getWidth())/2;
    int y0 = y+ (height-image.getHeight())/2;
    g.drawImage(image,x0,y0,null); }

    public Insets getBorderInsets(Component c) {
    return new Insets(0,0,0,0);}

    public boolean isBorderOpaque() {
    return true; }
}

Luego, compilamos, sin antes asegurarnos de haber dado la ruta correcta del directotio de carptas para los obejros “File” en la clase WindowImagenes

$jjavac WindowImagenes.java

Listo, aqui los pantallazos:

Espero les sirva a mas de uno.

Saludos

PD: alejandro.

About these ads

Acciones

Information

33 responses

27 07 2008
Daniel

Gracias, hace tiempo que necesitaba cargar imagenes en el Frame

1 08 2008
miguel

trabajo con netbeans 6.0 pero nose como trabajar el modo grafico- curso 2 semestre de informatica y redes – tecnico solicito ayuda

1 08 2008
inforux

Hola miguel, yo inicialmente trbaje con netbeans. una forma practica de trbajar imagenes con netbeans. seria
implementar la clase del tutorial de arriba. “PintaImagen.java” (tal como esta)
luego en tu aplicacion, dibujar tu JFrame, dentro de el, dibuja un JDesktopPane, ademas copia el metodo “cargarImagen()” (de la clase ContrlolaEventos del tutorial de arriba) en tu clase implementada.

Finalmente, llamalo en el constructor de tu clase, y le das como parametro el nombre de tu JDesktopPane, y la direccion de tu archivo imagen.

Listo! con eso deberia salirte sin errores, de todos modos cuentanos como te fue.
Venga un Saludos.

11 08 2008
David

Quisiera saber mas de como cargar una imagen en un MDI(java) use algunas lineas del ejemplo que dejaron y otras de un ejemplo mas practico pero no funciona, en el ejemplo mas practico que tengo funciona muy bien pero carga la imagen de la web y yo quiero cargarla de una carpeta que tengo dentro de las carpetas con las clases, que puedo hacer? realmente es posible cargar esa imagen? y que no me cause problemas de carga cada vez que quiera, se que es mas facil cargar imagenes en un frame que no sea MDI pero yo quiero esar ese, ayudenme!!!!!!

11 08 2008
inforux

hola david, agregar imagenes en java no es nada del otro mundo, siempre y cuando tengas una clase APARTE, independiente del resto de tus clases(obviamente dentro de tu carpeta de clases), esta misma te permita agregarlo a un JFrame, JInternalFrame.
Como es posible esto?
1.- Implemnta tu clase PintaImagen.java, tal como esta arriba.
2.-, Para pintar una imagen, primero debes agregar a tu frame, internalframe, un jDesktopPane.
3.- declara una variable del tipo File, y al momento de crearlo, dale como ruta, la ubicacion de tu archivo imagen.
4.- desde tu clase q quieres cargar la imagen, implementa el metodo “cargaImagen()” de arriba, ojo recibe 2 parametros, el nombre del JDesktopPane, y un archivo File.(tu imagen).
5.- llama al metodo y dale los parametros q pide.

Por otro lado, tambien me dices, q la aplicacion de arriba no te ejecuta?, realmente es raro. antes de postear algun demo, me aseguro obviamente q funcione. me gustaria mandes el error q te da, cosa q asi podremos ayudarte tecnicamente.
Recibe un saludo.

28 06 2013
Edgardo

Hola amigo de inforux, me gusto mucho este ejemplo para poner fondo a un jdesktoppane, pero porfavor podrias hacer una aplicacion donde pueda cargar una imagen en un jinternalframe y que el jinternalframe se ajuste al tamaño de la imagen….sería de los bueno si lo haces xfa :D

11 08 2008
David

Hola! el demo que dejó funciona bien, descuide; solo que yo hice algunas combinaciones con otro ejemplo y no funcionaron. Bueno hice lo que me dijo en un 90% el resto fue alguna añadidura personal y FUNCIONO!!!!!!. Simplemente quiero decirle gracias! espero estemos en contacto para alguna otra consulta. Saludos!

11 08 2008
David

Que tal amigo? tengo una consulta que no tiene que ver con la carga de imagenes, es esta: en un JInternalFrame, como puedo cerrar la ventana? no puedo usar: System.exit(0) por que obviamnete me termina el programa, cual es el comando especifico para cerrar solo la ventana(frame interno), seria una gran ayuda que me pudieras resolver ese problema.

11 08 2008
inforux

el metodo:
“setClosable(true);” aniade la “x” a la ventana tipo JInternalFrame.
“setDefaultCloseOperation(EXIT_ON_CLOSE);” la “x” a la ventana
tipo JFrame

5 09 2008
robert

gracias … por la informacion la andaba buscando … muchas gracias …cualkeri cosa te consultaré xD

11 09 2008
Dark Soul

Hola amigo Inforux, queria felicitarte por tu gran aporte con este ejemplo de
imagenes, pero quisiera que me ayudaras con una duda y es que quiero hacer una aplicacion MDI con Frames de java y quiero que mi imagen se redimencione
al cambio de tamaño del frame si meqyudas seria muy bueno de tu parte.

29 09 2008
Gerald

Como puedo hacer que una imagen de 300 y un tamaño de 2.3 x 2.8 no se vea grande en java
porque si lo abro con la clase indicada me muestra una de unos 9 x 10 , si alguien me podria ayudar le agradecería un monton

4 11 2008
Alexis

Excelente articulo, hice lo mismo que informux sin haberlo leido jeje, me cargo perfectamente, solo que le implemente que un botón llamara a un JFileChooser y el usuario mismo especifique la ubicación de la imagen; funciona muy bien, solo que me he topado con otra problematica: he buscado en muchos foros y páginas acerca de la redimensión de las imágenes, esto es porque el JDesktopPane tiene su tamaño, pero la imagen sobrepasa el limite y solo muestra una parte, alguno de ustedes sabe cómo darle otro tamaño? Me parece que la clase PintaImagen esta muy bien hecha, solo ese es el problema, la redimensión… les agradecería bastante si me pueden apoyar con este problema

7 11 2008
Anónimo

asdasdsa

7 11 2008
Anónimo

que onda, como estan quisiera saber como puedo implementar en un applet un file reader que cargue un texto de ceros y unos que forma un laberinto

7 11 2008
Anónimo

les agradeceria mucho si me pudieran dar una ayudadita con el file reader porfa

2 12 2008
Angel Zambrano

Hola.
Estoy trabajando en una aplicacion para una dependencia de gobierno y lo estoy haciendo con JDesktopPane y JInternalFrames. Queria preguntar si se puede cargar una imagen que se encuentra en otro paquete de la misma aplicacion.
La idea es tener un paquete con el código del programa y otro paquete con las imagenes que utilizare.
Muchas gracias, y el ejemplo si funciona

31 12 2008
roberto

necesito saber como cargar una imagen a un jDesktopPane1 pero que la imagen sea extraido de una base de datos

31 12 2008
roberto

necesito saber como cargar una imagen a un jDesktopPane1 pero que la imagen va a ser extraido de una base de datos en este caso SQLserver

3 04 2009
Youssef

buenos días
he hecho lo mismo que han hecho en el articulo, me funciona perfectamente, pero queria saber si hay algun modo de hacer lo mismo ,pero que sea automatico, sin ncesisdad de tener que seleccionar el botton.
he intentado hacerlo poniendo el valor del JRadioButton a true por defecto, pero aun asi tengo que picar en él para que despliegue la foto en el JDesktopPane.
espero su respuesta, muchas gracias. salu2

11 04 2009
oriana

me parece muy chevere…y si…a mas de uno le sirve…te felicito por compartir tu conocimiento…eso te hace llegar mas lejos, un saludo…

28 06 2009
Caste

Que tal Dudes… Una consulta… recientemente estoy trabajando con Imágenes en Java… los puntos son…

a)cuando cargo una Imágen de tipo *.bmp de 800 x 600p, simplemente no la muestra, más sin embargo… en Impresión de Pantalla me muestra datos Negativos… de Ancho y Alto de dicha Imagén…
Tu dirias… checa bien lo de Memoria… pero esta OKAY… cuando cargo una Imágen en *.jpg, no hay ningún problema,

b)Cuando le doy nuevamente en Archivo/Abrir, no me muestra la nueva Imàgen en el JPanel, pero si me da la Descripción de la Imágen en un Jtextpane que tengo
Tengo una pequeña duda… sobre este apartado, posiblemente no estoy llamando bien a cargar la Imágen,entonces para solucionar esto lo que hice fue un botoncillo.

Anexo Código…
//Mostrar Imagen
private void mostrarImagen(File file) {
PanelImagen imgPanel = new PanelImagen(file, this.pnlImagen.getWidth(), this.pnlImagen.getHeight());
this.pnlImagen.add(imgPanel);
System.out.println(“Ancho” + this.w);
System.out.println(“Alto” + h);
System.out.println(“Cantidad de Pixels are” + w * h);
// System.out.println(“hola”);
this.repaint();
}
//Menu Archivo
private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser fc = new JFileChooser();
fc.setFileFilter(new FileNameExtensionFilter(“Archivos de imagen”,”jpg”,”jpeg”,”gif”,”bmp”));
previews.setText(“Cargando Imágen…”);
int opcion = fc.showDialog(this, “Open”);

if (opcion == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
ruta = file.getPath();
this.imagen = Toolkit.getDefaultToolkit().getImage(ruta);
MediaTracker tracker = new MediaTracker(this);
System.out.println(“ruta”+ruta);
tracker.addImage(imagen, 1);
this.mostrarImagen(file);
try {
if (!tracker.waitForID(1, 400000)) {
System.out.println(“Error en la carga de la imagen”);
//System.exit(0);
}
} catch (InterruptedException e) {
System.out.println(e);
}
//this.mostrarImagen(file);
//this.mostrarImagen(file);
// this.cargaDirectorio(file.getParent());
previews.setText(“Imagén Cargada…”);
w = imagen.getWidth(this);
h = imagen.getHeight(this);
System.out.println(“La ruta de la Imagen es:” + ruta);
previews.setText(“\n Características de la Imagén:” + “\n\n” + ” Ancho de la Imagén” +
“:” + w + ” pixeles” + “\n\n Alto de la Imagén” + “:” + h + ” pixeles” + “\n\n\n Cantidad de Pixeles son: ” + w * h);

}
}
// Refresh Button
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

this.hide();
new MainFrame().setVisible(true);

}
//Main
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {

new MainFrame().setVisible(true);

}
});

}
Utilizo Netbeans 6.5
Gracias…. dudes…
Saludos..
Caste

2 10 2009
Alexamar

Hola!! Saludos amigo inforux!! el código que has publicado funcionan igual cuando trabajas con el sistema operativo de Ubuntu??? y claro con netbeans 6.5.

5 11 2009
Micky

gracias man, una pregunta, alguien sabe como adaptar la imagen al JDesktoppane que la contiene, gracias

18 11 2009
remizero

Hola inforux, saludos.

Estaba buscando alguna información que me ayudara como hacer una clase para mi actionPerformed y caí aquí por pura causalidad y que me sirvió de mucho tu clase ControlaEventos, pues eso era lo que andaba buscando y me ha caído de maravilla.

Tengo una duda, pues tengo una aplicación MDI y al ver tu ejemplo me dio curiosidad agregar una imagen a mi JDesktopPane, he probado tu ejemplo paro no me muestra las imágenes, trabajo con eclipse 3.5, he creado una carpeta en la raíz de tu ejemplo la cual he llamado de igual forma pero aun así no me funciona, si me pudieras ayudar en este problema que de seguro es una tontería pero con tantas cosas en que pensar en este proyecto que no la veo.
Gracias de antemano.

9 09 2010
José

muy bueno, la verdad lo estaba necesitando para implementar un tablero de ajedrez, pero poner las imágenes de la piezas en el mismo en una ubicación deseada y tamaño especifico…. Muchas gracias, lo voy a tratar de adaptar a lo q tengo

15 10 2010
denis

Hola gracias, me ha ayudado muchisimo.

9 11 2010
Gilberto Jimenez

Hola Alejandro. Sólo quiero decirte que este artículo me ha servido mucho para programar un juego de azar, lo entrego este viernes 12 de Noviembre, 2010.

Gracias por tu aporte!

18 11 2011
gaby

Hola tengo este problema
No cargo imagen, sorry
Excepción: Can’t read input file!
por q no puede ser lleido la imagen . trabajo con netbeans

23 06 2012
Conde

Tengo el mismo problema
me dice Can’t read input file!
Igual uso Neatbeans!!!

8 09 2012
Anónimo

Muchas gracias canijo… Era lo que necesitaba

1 11 2012
Anónimo

Amigaso, inmensas gracias he aprendido bastante de el ejemplo, que se tomo la molestia de publicar. entre mas nos colaboremos entre desarrolladores la industria del software siempre apuntara hacia adelante.

15 07 2014
Small Dog Breeds Information

Small Dog Breeds Information

Imagenes en JAVA en un JDesktopPane. | INFORUX

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

A %d blogueros les gusta esto: