views:

152

answers:

3

I have created a class that extends JLabel to use as my object moving around a JPanel for a game.

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;

 }

}

I am then trying to add it onto my JPanel. From here I will randomly have it increment its x and y coordinates to float it around the screen. I can not get it to paint itself onto the JPanel. I know there is a key concept I am missing here that involves painting components on different panels. Here is what I have in my GamePanel class

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);

 }

}

Any suggestions on how to get this to add to the JPanel? Also, is this a good way to go about having the picture float around the screen randomly for a game?

+1  A: 

The main problem I believe is that you don't really add the image to Head in your constructor.

What you need to do is create a new ImageIcon like you are doing, and in your constructor do something lie this;

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;
}

This will create your Head with the specified image.

Once you sort out the constructor issue, you can then call setLocation() on you Head object from the JPanel you have added it to. That is how you can move it around randomly.

Also, in the JPanel you are adding the Head to, you need to make sure you set the LayoutManaer to null, so you can manually place the component on the panel yourself.

jjnguy
+2  A: 

First of all there is no need to extend a JLabel to do this.

a) you set the size of the label after you add the image to the label by using:

label.setSize( label.getPreferredSize() );

b) You don't need the draw(), and all the setter methods. To move the label all you do is use:

label.setLocation(...);

c) if you want to increment the location you would use something like:

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

Once you set the size and location of the label you can add it directly to the panel. Make sure you have done:

panel.setPreferredSize() 

when you add your panel to the content pane of your frame.

Your code is too vague to give specific suggestions. If you need more help post your SSCCE. Your problem could be the usage of layout manager or the fact you aren't using layout managers.

camickr
This does make it a lot easier. Thanks for the help
jjpotter
+1  A: 

Yes, you should set the layout manager for your JPanel ( GamePanel ) to null that tells the system:

Don't place it for me, I'll do it manually

edit

I think it would be clearer if I give you a running demo.

See this example. As camickr points, you don't have to subclass the components.

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 );

    }
}

BTW, not setting the layout manager to null also works, but if you resize the window, the jpanel would automatically set the location for you.

running demo

OscarRyz