我创建了一个扩展JLabel的类,用作在游戏的JPanel中移动的对象。
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;
}
}
然后我尝试将其添加到我的JPanel中。从这里我将随机增加其x和y坐标以使其在屏幕上浮动。我无法让它自己画在JPanel上。我知道我在这里缺少一个关键概念,涉及在不同面板上绘制组件。这是我在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);
}
}
有关如何将此内容添加到JPanel的任何建议?另外,这是一个很好的方法让照片在游戏中随机漂浮在屏幕上吗?
答案 0 :(得分:2)
首先,没有必要扩展JLabel来执行此操作。
a)使用以下方法将图像添加到标签后设置标签的大小:
label.setSize( label.getPreferredSize() );
b)您不需要draw()和所有setter方法。要移动标签,您只需使用:
label.setLocation(...);
c)如果你想增加位置,你会使用类似的东西:
label.setLocation(label.getLocation()。x + 5,...);
设置标签的大小和位置后,您可以将其直接添加到面板中。确保你已经完成了:
panel.setPreferredSize()
将面板添加到框架的内容窗格时。
您的代码太模糊,无法提供具体建议。如果您需要更多帮助,请发布SSCCE。您的问题可能是布局管理器的使用或您没有使用布局管理器的事实。
答案 1 :(得分:2)
是的,您应该将JPanel(GamePanel)的布局管理器设置为null,告诉系统:
不要把它放在我身上,我会手动完成
修改强>
我认为如果我给你一个正在运行的演示会更清楚。
请参阅此示例。正如camickr所指出的那样,您不必对组件进行子类化。
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 );
}
}
顺便说一句,没有将布局管理器设置为null也可以,但是如果你调整窗口大小,jpanel会自动为你设置位置。
running demo http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png
答案 2 :(得分:1)
我认为主要问题是你没有在构造函数中将图像真正添加到Head
。
你需要做的就是像你正在做的那样创建一个新的ImageIcon
,并在你的构造函数中做一些事情;
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;
}
这将使用指定的图片创建Head
。
一旦你解决了构造函数问题,你就可以从你添加它的Head
对象JPanel
上调用setLocation()。这就是你可以随意移动它的方法。
此外,在JPanel
中您要添加Head
,您需要确保将LayoutManaer
设置为null,这样您就可以自己手动将组件放在面板上