Reputation: 45
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?
Upvotes: 2
Views: 1458
Reputation: 199333
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 http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png
Upvotes: 2
Reputation: 138982
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.
Upvotes: 1
Reputation: 324207
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.
Upvotes: 2