Autor
|
Tema: Dibujar con Graphics encima de un panel con una imagen de fondo (Leído 14,373 veces)
|
NathanD
Desconectado
Mensajes: 48
|
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
|
Coloca el código que tengas para ver las posibles fallas.
|
|
|
En línea
|
|
|
|
NathanD
Desconectado
Mensajes: 48
|
É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: import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.ImageIcon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; private final static int ANCHO = 512; private final static int ALTO = 384; private final static int DIAMETRO = 20; private float x, y; private float vx, vy; public Demo1() { setPreferredSize (new Dimension(ANCHO, ALTO )); x = 10; y = 20; vx = 300; vy = 400; } private void fisica(float dt) { x += vx * dt; y += vy * dt; if (vx < 0 && x <= 0 || vx > 0 && x + DIAMETRO >= ANCHO) vx = -vx; if (vy < 0 && y < 0 || vy > 0 && y + DIAMETRO >= ALTO) vy = -vy; } g.fillRect(0, 0, ANCHO, ALTO); g. fillOval(Math. round(x ), Math. round(y ), DIAMETRO, DIAMETRO ); } this.repaint(); } public void cicloPrincipalJuego () throws Exception { float dt = 0.01f; while (true) { fisica(dt); dibuja(); } } jf. setDefaultCloseOperation(JFrame. EXIT_ON_CLOSE); jf.setResizable(false); Demo1 demo1 = new Demo1(); jf.setContentPane(crearPanel()); jf.pack(); jf.setVisible(true); demo1.cicloPrincipalJuego(); } panel.add(label); return panel; } }
Muchas gracias por vuestra paciencia y saludos.
|
|
|
En línea
|
|
|
|
Mitsu
|
Hago uso de BufferedImage y de ImageIO para almacenar la imagen en un buffer y leer la imagen original respectivamente. import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; @SuppressWarnings("serial") public class ImageJPanel extends JFrame { public static void main (String... args) { new ImageJPanel(); } public ImageJPanel() { super("Dibujo sobre imagen"); this.add(new PanelOverDraw()); this.setSize(484,519); this. setDefaultCloseOperation(JFrame. DISPOSE_ON_CLOSE); this.setVisible(true); } public class PanelOverDraw extends JPanel { public PanelOverDraw() { File imageFile = new File("background.jpg"); // guarda la imagen en un archivo try { img = ImageIO.read(getClass().getResourceAsStream(imageFile.toString())); // la carga en una BufferedReader e.printStackTrace(); } this. setPreferredSize(new Dimension(484, 409)); // creamos una instancia graphics desde la imagen para pintar sobre ella pint. setColor(Color. GREEN); pint.fillRect(200,200,100,100); pint.dispose(); } @Override { super.paintComponent(g); g.drawImage(img,0,0,null); // dibuja la imagen al iniciar la aplicacion } } }
|
|
« Última modificación: 13 Noviembre 2013, 05:45 am por M1t$u »
|
En línea
|
|
|
|
NathanD
Desconectado
Mensajes: 48
|
Hago uso de BufferedImage y de ImageIO para almacenar la imagen en un buffer y leer la imagen original respectivamente. import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JFrame; import javax.swing.JPanel; @SuppressWarnings("serial") public class ImageJPanel extends JFrame { public static void main (String... args) { new ImageJPanel(); } public ImageJPanel() { super("Dibujo sobre imagen"); this.add(new PanelOverDraw()); this.setSize(484,519); this. setDefaultCloseOperation(JFrame. DISPOSE_ON_CLOSE); this.setVisible(true); } public class PanelOverDraw extends JPanel { public PanelOverDraw() { File imageFile = new File("background.jpg"); // guarda la imagen en un archivo try { img = ImageIO.read(getClass().getResourceAsStream(imageFile.toString())); // la carga en una BufferedReader e.printStackTrace(); } this. setPreferredSize(new Dimension(484, 409)); // creamos una instancia graphics desde la imagen para pintar sobre ella pint. setColor(Color. GREEN); pint.fillRect(200,200,100,100); pint.dispose(); } @Override { super.paintComponent(g); g.drawImage(img,0,0,null); // dibuja la imagen al iniciar la aplicacion } } }
Muchísimas gracias, no sabes cuánto me has ayudado. Gracias.
|
|
|
En línea
|
|
|
|
NathanD
Desconectado
Mensajes: 48
|
Copio y pego el código y me sale el siguiente error de compilación: 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. this.add(new PanelOverDraw());
¿A qué se puede deber? Gracias por tu paciencia y un saludo.
|
|
|
En línea
|
|
|
|
Mitsu
|
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
Mensajes: 48
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Una imagen encima de otra.
Diseño Gráfico
|
Hadess_inf
|
3
|
4,163
|
9 Agosto 2008, 11:45 am
por y0u uNSeCure
|
|
|
Dibujar un engranaje en java con Graphics
Java
|
meyinkin
|
1
|
5,678
|
2 Diciembre 2009, 16:02 pm
por Leyer
|
|
|
Problemas con app simple para dibujar firma y guardarla como imagen
Java
|
dani86
|
7
|
5,354
|
19 Febrero 2021, 08:56 am
por Juan Pelaez
|
|
|
Iluminar fondo cuando paso puntero por encima
Desarrollo Web
|
jdjorge99
|
0
|
1,998
|
26 Noviembre 2018, 20:06 pm
por jdjorge99
|
|
|
Mostrar texto al poner el cursor encima de una imagen
Desarrollo Web
|
enrique4480
|
1
|
11,103
|
21 Diciembre 2023, 19:12 pm
por .:Xx4NG3LxX:.
|
|