Pregunta

He creado una clase que se extiende JLabel para su uso como mi objeto que se mueve en torno a un JPanel para un juego.

import javax.swing.*;

public class Head extends JLabel {

 int xpos;
 int ypos;

 int xvel;
 int yvel;

 ImageIcon chickie = new ImageIcon(
        "C:\\Users\\jjpotter.MSDOM1\\Pictures\\clavalle.jpg");
 JLabel myLabel = new JLabel(chickie);

 public Head(int xpos, int ypos, int xvel, int yvel){

  this.xpos = xpos;
  this.ypos = ypos;
  this.xvel = xvel;
  this.yvel = yvel;
 }

 public void draw(){
  myLabel.setLocation(xpos, ypos);
 }

 public double getXpos() {
  return xpos;
 }

 public double getYpos() {
  return ypos;
 }

 public int getXvel() {
  return xvel;
 }

 public int getYvel() {
  return yvel;
 }

 public void setPos(int x, int y){

  xpos = x;
  ypos = y;

 }

}

Estoy a continuación, tratando de añadirlo a mi JPanel. A partir de aquí voy a tener que incrementar su aleatoriamente coordenadas X e Y para flotar alrededor de la pantalla. No puedo conseguir que la pintura sí mismo en los JPanel. Sé que es un concepto clave que me falta aquí que involucra pintura componentes en diferentes paneles. Aquí es lo que tengo en mi clase GamePanel

import java.awt.Dimension;
import java.util.Random;
import javax.swing.*;


public class GamePanel extends JPanel {

 Random myRand = new Random();
 Head head = new Head(20,20,0,0);

 public GamePanel(){

  this.setSize(new Dimension(640, 480));
  this.add(head);

 }

}

¿Alguna sugerencia sobre cómo conseguir esto para añadir a la JPanel? Además, esta es una buena manera de ir sobre el flotador que tiene la imagen por la pantalla de forma aleatoria para un juego?

¿Fue útil?

Solución

En primer lugar no hay necesidad de extender un JLabel para hacer esto.

a) se establece el tamaño de la etiqueta después de agregar la imagen a la etiqueta mediante el uso de:

label.setSize( label.getPreferredSize() );

b) No es necesario el sorteo (), y todos los métodos setter. Para mover la etiqueta de todo lo que hacen es usar:

label.setLocation(...);

c) si se desea incrementar la ubicación que usar algo como:

label.setLocation (label.getLocation () x + 5, ....);

Una vez que se establece el tamaño y la ubicación de la etiqueta se puede añadir directamente al panel. Asegúrese de que ha hecho:

panel.setPreferredSize() 

cuando se agrega a su panel el panel de contenido de su marco.

Su código es demasiado vaga para dar sugerencias específicas. Si necesita más ayuda después de su SSCCE . Su problema podría ser el uso de controlador de distribución o el hecho de que no está utilizando controladores de distribución.

Otros consejos

Sí, se debe configurar el controlador de distribución para su JPanel (GamePanel) a nula que indica al sistema:

No lo coloque para mí, lo haré manualmente

editar

creo que sería más claro si le doy una demostración de funcionamiento.

Vea este ejemplo. Como puntos camickr, usted no tiene a la subclase de los componentes.

import javax.swing.*;
import java.util.Timer;
import java.util.*;

class FloatingDemo {
    public static void main( String [] args ){
        // create the panel         
        JPanel panel = new JPanel();
        panel.setLayout(null);

        // create the label with an image
        final JLabel label = new JLabel(new ImageIcon("StackOverflowLogo.png"));
        label.setSize(label.getIcon().getIconWidth(), 
                      label.getIcon().getIconHeight());
        panel.add( label );

        // create the frame containing both 
        JFrame frame = new JFrame();
        frame.add( panel );
        frame.setSize(800, 600 );
        frame.setVisible( true );

        // move it randomly every second  
        Timer timer = new Timer();
        final Random random = new Random();
        timer.schedule( new TimerTask() {
           public void run(){
                 label.setLocation( random.nextInt(800-label.getWidth()), 
                                    random.nextInt(600-label.getHeight()));       
           } 
        }, 0, 1000 );

    }
}

Por cierto, no se establece el controlador de distribución a nula también funciona, pero si cambia el tamaño de la ventana, el JPanel establecería automáticamente la ubicación para usted.

correr demostración http://img444.imageshack.us/img444/2567/capturadepantalla201006c .png

El problema principal es que creo que realmente no agrega la imagen para Head en su constructor.

Lo que hay que hacer es crear un nuevo ImageIcon como usted está haciendo, y en su constructor hacer algo mentira esto;

public Head(int xpos, int ypos, int xvel, int yvel){
    // calls the JLabel constructor to create a label with an image
    super(new ImageIcon("C:\\Users\\jjpotter.MSDOM1\\Pictures\\clavalle.jpg"))
    this.xpos = xpos;
    this.ypos = ypos;
    this.xvel = xvel;
    this.yvel = yvel;
}

Esto creará su Head con la imagen especificada.

Una vez que a resolver el problema del constructor, a continuación, puede llamar setLocation () en su vida Head objeto de la JPanel que se haya agregado a. Así es como se puede mover en torno al azar.

Además, en el JPanel está agregando el Head a, es necesario asegurarse de que se establece la LayoutManaer a nula, por lo que puede colocar manualmente el componente en el panel mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top