Foro de elhacker.net

Programación => Java => Mensaje iniciado por: NathanD en 12 Noviembre 2013, 19:57 pm



Título: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: NathanD 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.


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: Mitsu en 12 Noviembre 2013, 20:57 pm
Coloca el código que tengas para ver las posibles fallas.


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: NathanD 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.


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: Mitsu 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.

(http://i.imgur.com/x3oFs1X.png)

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.  


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: NathanD 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.

(http://i.imgur.com/x3oFs1X.png)

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.


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: NathanD 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.


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: Mitsu 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.


Título: Re: Dibujar con Graphics encima de un panel con una imagen de fondo
Publicado por: NathanD 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.