Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Diferentes objetos en JPanel.

Buenas, llevo unos cuantos dias buscando solución a esto y no la encuetro, igual es tan básico que todo el mundo lo da por sentado y no me entero ^^

Tengo una clase donde extiendo mi JPanel y quiero importar objetos de otras clases.
En principio tengo clases que crean la imagen con un .gif, en el código las 'importo' y dibujo con graphics2D. Son 'pacImg' y 'tinnImg'. Las dos tienen un ActionListener y responden a eventos de teclado. Hasta aquí ningún problema.

Ahora quiero dibujar objetos tipo ellipse2D, donde los datos de la ellipse los tengo en otra clase.
Cuando escribo el codigo en mi clase principal, donde tengo el JPnel, intento hacerles a estas ellipses un RenderingHint, ponerles un grosor de linea con BasicStroke y dibujarlas con draw y fill... pero el código me da error:


import java.awt.Color;
import java.awt.Image; // Nos permite importar las imágenes 'jpg' o 'gif'.
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.BasicStroke;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.Dimension;

import java.awt.event.ActionListener; // Nos permite 'escuchar' las acciones.
import java.awt.event.ActionEvent; // Nos permite realizar acciones en el tablero.
import java.awt.event.KeyEvent; // Nos permite escuchar las acciones del teclado.
import java.awt.event.KeyAdapter;

import java.awt.geom.Ellipse2D;

import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.Timer;

/**
* Esta clase construye el tablero sobre el que se incluirán los objetos,
* tanto estáticos como móviles, y se inicializa el motor gráfico.
*
* @author Yo
* @version 10/04/2014
*/

/**
* Preparamos la clase para que pueda 'escuchar' desde la pantalla las acciones
* que se le indiquen desde el exterior.
*/

public class Lienzo extends JPanel implements ActionListener
{
// Campos.
private Timer reloj; // Se instancia para dar una continuidad temporal al movimiento.


private PacM pacImg; // Invoca la creación de Pacman.
private Tinn tinnImg; // Invoca la creación de Tinn.

private Puntos pellets; // Invoca la creación de los puntos pequeños.
private Puntos powerPellets;
private Puntos cereza;

/**
* El constructor inicializa las variables y crea los objetos requeridos para
* que aparezcan en pantalla.
*/
public Lienzo(){


addKeyListener(new TAdapter());
setFocusable(true); // Se inicializa para que el JPanel reciba las notificaciones del reclado.
setBackground(Color.BLACK); // Indica el color del fonde de pantalla.
setDoubleBuffered(true); // Para que no existan relentizaciones en las animaciones.

pellets = new Puntos("P", 150, 200);

pacImg = new PacM();
tinnImg = new Tinn();

reloj = new Timer(5, this);
reloj.start();
}
/**
* Implementación de los metodos necesarios para que funcione el juego.
*/

/** Representación de objetos en pantalla. **/
// Importa los dibujo del juego los representa en pantalla.
public void paint(Graphics g){
super.paint(g);
Graphics g2d = (Graphics2D)g;

// Definimos algunas claves para mejorar la visualización del objeto. ¡¡¡NO FUNCIONA!!!
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

// Invocamos los objetos.
g2d.drawImage(pacImg.getImage(), pacImg.getX(), pacImg.getY(), this);
g2d.drawImage(tinnImg.getImage(), tinnImg.getX(), tinnImg.getY(), this);

// Creamos el punto.
Ellipse2D e = new Ellipse2D.Double(pellets.getX(), pellets.getY(),
pellets.getDiameter(), pellets.getDiameter());
BasicStroke stroke = new BasicStroke(1);
g2d.setStroke(stroke); // Definimos el grosor de la linea.
g2d.setColor(pellets.getColor()); // Hay que llamar al parametro color de Puntos.

g2d.draw(e); // Dibujamos el punto.
g2d.fill(e); // Rellenamos el punto.

Toolkit.getDefaultToolkit().sync();
g.dispose(); // Liberamos el contexto gráfico.
}

// Cuando Pacman realiza una acctión, se vuelve a pintar.
public void actionPerformed(ActionEvent e){
pacImg.move();
tinnImg.move();
repaint();
}
}

Total, que no consigo meter en este JPanel las elipses de ninguna forma... ¿Que estoy haciendo mal?¿Hay que utilizar una clase distinta y después juntarla a un JFrame?

No se...

Gracias por las respuestas.

abril 12, 2014 | Registered Commenterilwe

"... . pero el código me da error"

¿Qué error?.

Por otra parte, es más recomendable usar paintComponent:

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paint(java.awt.Graphics)

http://docs.oracle.com/javase/7/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)

abril 12, 2014 | Registered Commenterchoces

Ante todo, muchas gracias por contestar.

Bueno... ''pabernos matao' he estado mas de 12 horas haciendo pruebas con el código de marras, y no sabía por que no me compilaba.

Me daba un error de compilación en '.setRenderingHint' 'cannot find symbol', y si eliminaba el metodo me daba un error en el '.setStroke' , etc...

Hace un momento, depues de postear aqui (totalmente desesperado, la verdad) he encontrado el error.

Despues de invocar el metodo paint con 'super.paint(g);' creaba el Graphic2D:

Graphics g2d = (Graphics2D) g; <--- ERROR

cuando en realidad es:

Graphics2D g2d = (Graphics2D) g; <---- POR FIN!!!

Y eso es todo :D

Gracias de nuevo por el interes ;)

abril 12, 2014 | Registered Commenterilwe