elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Dibujar con Graphics encima de un panel con una imagen de fondo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Dibujar con Graphics encima de un panel con una imagen de fondo  (Leído 14,373 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Dibujar con Graphics encima de un panel con una imagen de fondo
« en: 12 Noviembre 2013, 19:57 pm »

Buenas, estoy con algo que me lleva trayendo de cabeza desde hace bastante. Mi pregunta es ésa, ¿cómo puedo poner una imagen de fondo, y luego superponer figuras con Graphics? Lo he intentado de mil maneras, a veces no me hace caso, y otras da error en tiempo de ejecución, y no sabría ni qué código poner aquí. He conseguido poner otros componentes como JLabels o JButtons, pero con Graphics no puedo.

Gracias de antemano y saludos.


En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #1 en: 12 Noviembre 2013, 20:57 pm »

Coloca el código que tengas para ver las posibles fallas.


En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #2 en: 13 Noviembre 2013, 00:23 am »

Éste es uno de tantos intentos. No está muy limpio; lo he hecho con algo de prisa. Lo dicho arriba, no sé como poner un panel de fondo y luego ver los Graphics encima de éste.

El código:
Código
  1. import java.awt.Color;
  2. import java.awt.Container;
  3. import java.awt.Dimension;
  4. import java.awt.Graphics;
  5.  
  6. import javax.swing.ImageIcon;
  7. import javax.swing.JComponent;
  8. import javax.swing.JFrame;
  9. import javax.swing.JLabel;
  10. import javax.swing.JPanel;
  11.  
  12. public class Demo1 extends JComponent {
  13.  
  14.  
  15.    private final static int ANCHO = 512;
  16.  
  17.    private final static int ALTO = 384;
  18.  
  19.    private final static int DIAMETRO = 20;
  20.  
  21.    private float x, y;
  22.  
  23.    private float vx, vy;
  24.  
  25.    public Demo1() {
  26.        setPreferredSize(new Dimension(ANCHO, ALTO));
  27.        x = 10;
  28.        y = 20;
  29.        vx = 300;
  30.        vy = 400;
  31.    }
  32.  
  33.    private void fisica(float dt) {
  34.        x += vx * dt;
  35.        y += vy * dt;
  36.        if (vx < 0 && x <= 0 || vx > 0 && x + DIAMETRO >= ANCHO)
  37.            vx = -vx;
  38.        if (vy < 0 && y < 0 || vy > 0 && y + DIAMETRO >= ALTO)
  39.            vy = -vy;
  40.    }
  41.  
  42.    public void paint(Graphics g) {
  43.  
  44.        g.setColor(Color.WHITE);
  45.        g.fillRect(0, 0, ANCHO, ALTO);
  46.        g.setColor(Color.RED);
  47.        g.fillOval(Math.round(x), Math.round(y), DIAMETRO, DIAMETRO);
  48.    }
  49.  
  50.    private void dibuja() throws Exception {
  51.     this.repaint();
  52.    }
  53.  
  54.    public void cicloPrincipalJuego() throws Exception {
  55.        float dt = 0.01f;
  56.        while (true) {
  57.         Thread.sleep(10);
  58.         fisica(dt);
  59.            dibuja();
  60.        }
  61.    }
  62.  
  63.    public static void main(String[] args) throws Exception {
  64.     JFrame jf = new JFrame("Demo1");
  65.        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  66.        jf.setResizable(false);
  67.  
  68.        Demo1 demo1 = new Demo1();
  69.        jf.setContentPane(crearPanel());
  70.        jf.pack();
  71.        jf.setVisible(true);
  72.        demo1.cicloPrincipalJuego();
  73.    }
  74.  
  75. private static Container crearPanel() {
  76. JPanel panel = new JPanel();
  77. JLabel label = new JLabel();
  78.  
  79. label.setIcon(new ImageIcon("img.jpg"));
  80. panel.add(label);
  81.  
  82. return panel;
  83. }
  84. }

Muchas gracias por vuestra paciencia y saludos.
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #3 en: 13 Noviembre 2013, 05:43 am »

Hago uso de BufferedImage y de ImageIO para almacenar la imagen en un buffer y leer la imagen original respectivamente.



Código
  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.IOException;
  8.  
  9. import javax.imageio.ImageIO;
  10. import javax.swing.JFrame;
  11. import javax.swing.JPanel;
  12.  
  13. @SuppressWarnings("serial")
  14. public class ImageJPanel extends JFrame {
  15.  
  16.  
  17. public static void main(String... args) {
  18. new ImageJPanel();
  19. }
  20.  
  21. public ImageJPanel() {
  22. super("Dibujo sobre imagen");
  23.  
  24. this.add(new PanelOverDraw());
  25. this.setSize(484,519);
  26. this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  27. this.setVisible(true);
  28. }
  29.  
  30. public class PanelOverDraw extends JPanel {
  31.  
  32.  
  33. private BufferedImage img = null;
  34.  
  35. public PanelOverDraw() {
  36.  
  37. File imageFile = new File("background.jpg"); // guarda la imagen en un archivo
  38. try {
  39. img = ImageIO.read(getClass().getResourceAsStream(imageFile.toString())); // la carga en una BufferedReader
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43.  
  44. this.setPreferredSize(new Dimension(484,409));
  45.  
  46. // creamos una instancia graphics desde la imagen para pintar sobre ella
  47. Graphics2D pint = img.createGraphics();
  48.        pint.setColor(Color.GREEN);
  49.        pint.fillRect(200,200,100,100);
  50.        pint.dispose();
  51.  
  52. }
  53.  
  54. @Override
  55. public void paintComponent(Graphics g)
  56. {
  57. super.paintComponent(g);
  58. g.drawImage(img,0,0,null); // dibuja la imagen al iniciar la aplicacion
  59. }
  60.  
  61. }
  62. }
  63.  
« Última modificación: 13 Noviembre 2013, 05:45 am por M1t$u » En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #4 en: 13 Noviembre 2013, 09:04 am »

Hago uso de BufferedImage y de ImageIO para almacenar la imagen en un buffer y leer la imagen original respectivamente.



Código
  1. import java.awt.Color;
  2. import java.awt.Dimension;
  3. import java.awt.Graphics;
  4. import java.awt.Graphics2D;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.io.IOException;
  8.  
  9. import javax.imageio.ImageIO;
  10. import javax.swing.JFrame;
  11. import javax.swing.JPanel;
  12.  
  13. @SuppressWarnings("serial")
  14. public class ImageJPanel extends JFrame {
  15.  
  16.  
  17. public static void main(String... args) {
  18. new ImageJPanel();
  19. }
  20.  
  21. public ImageJPanel() {
  22. super("Dibujo sobre imagen");
  23.  
  24. this.add(new PanelOverDraw());
  25. this.setSize(484,519);
  26. this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
  27. this.setVisible(true);
  28. }
  29.  
  30. public class PanelOverDraw extends JPanel {
  31.  
  32.  
  33. private BufferedImage img = null;
  34.  
  35. public PanelOverDraw() {
  36.  
  37. File imageFile = new File("background.jpg"); // guarda la imagen en un archivo
  38. try {
  39. img = ImageIO.read(getClass().getResourceAsStream(imageFile.toString())); // la carga en una BufferedReader
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43.  
  44. this.setPreferredSize(new Dimension(484,409));
  45.  
  46. // creamos una instancia graphics desde la imagen para pintar sobre ella
  47. Graphics2D pint = img.createGraphics();
  48.        pint.setColor(Color.GREEN);
  49.        pint.fillRect(200,200,100,100);
  50.        pint.dispose();
  51.  
  52. }
  53.  
  54. @Override
  55. public void paintComponent(Graphics g)
  56. {
  57. super.paintComponent(g);
  58. g.drawImage(img,0,0,null); // dibuja la imagen al iniciar la aplicacion
  59. }
  60.  
  61. }
  62. }
  63.  

Muchísimas gracias, no sabes cuánto me has ayudado. Gracias.
En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #5 en: 14 Noviembre 2013, 20:32 pm »

Copio y pego el código y me sale el siguiente error de compilación:

Código:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1348)
at ImageJPanel$PanelOverDraw.<init>(ImageJPanel.java:40)
at ImageJPanel.<init>(ImageJPanel.java:25)
at ImageJPanel.main(ImageJPanel.java:19)

La línea del error es la 24.

Código
  1. this.add(new PanelOverDraw());

¿A qué se puede deber? Gracias por tu paciencia y un saludo.
En línea

Mitsu

Desconectado Desconectado

Mensajes: 259



Ver Perfil WWW
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #6 en: 14 Noviembre 2013, 20:56 pm »

ImageIO.read() está retornando null. Esto significa, que el path de la imagen está mal. Si tienes la imagen en un subpaquete, no olvides colocar "/" al principio del path.
En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Dibujar con Graphics encima de un panel con una imagen de fondo
« Respuesta #7 en: 14 Noviembre 2013, 21:29 pm »

Vale, ya está, tenía que colocar la imagen en la carpeta bin con los .class, aunque hasta ahora la he puesto en la carpeta del proyecto...

Muchísimas gracias otra vez.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una imagen encima de otra.
Diseño Gráfico
Hadess_inf 3 4,163 Último mensaje 9 Agosto 2008, 11:45 am
por y0u uNSeCure
Dibujar un engranaje en java con Graphics
Java
meyinkin 1 5,678 Último mensaje 2 Diciembre 2009, 16:02 pm
por Leyer
Problemas con app simple para dibujar firma y guardarla como imagen
Java
dani86 7 5,354 Último mensaje 19 Febrero 2021, 08:56 am
por Juan Pelaez
Iluminar fondo cuando paso puntero por encima
Desarrollo Web
jdjorge99 0 1,998 Último mensaje 26 Noviembre 2018, 20:06 pm
por jdjorge99
Mostrar texto al poner el cursor encima de una imagen
Desarrollo Web
enrique4480 1 11,103 Último mensaje 21 Diciembre 2023, 19:12 pm
por .:Xx4NG3LxX:.
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines