2010-06-09 39 views
2

我创建了一个扩展JLabel的类,用作我的对象在游戏的JPanel中移动。问题将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的任何建议?另外,这是一个很好的方式来让图片随机在屏幕上随意浮动游戏吗?

+1

重新格式化的代码;如果不正确请回复。 – trashgod 2010-06-09 15:07:27

回答

2

首先,不需要扩展JLabel来完成此操作。

a)您设置标签的大小,您可以通过使用图像添加到标签后:

label.setSize(label.getPreferredSize()); 

b)你不需要平局(),和所有的setter方法。要移动标签的所有你要做的就是使用:

label.setLocation(...); 

C)如果你想增加你会使用类似的位置:

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

一旦您设置了标签的大小和位置,您可以直接将其添加到面板。请确保您已完成:

panel.setPreferredSize() 

当您将面板添加到帧的内容窗格时。

您的代码太含糊不清,无法给出具体的建议。如果您需要更多帮助,请发送您的SSCCE。你的问题可能是布局管理器的用法,或者你没有使用布局管理器。

+0

这确实使它容易得多。谢谢您的帮助 – jjpotter 2010-06-10 13:14:21

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与指定的图像。

一旦你解决了构造函数的问题,然后你可以调用你已经添加到的JPanel对象Head的setLocation()对象。这就是你可以随意移动的方式。

另外,在JPanel中,您要添加Head,您需要确保将LayoutManaer设置为空,以便您可以手动将组件置于面板上。

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

    } 
} 

BTW,不设置布局管理器也为空的作品,但如果你调整窗口大小,JPanel的会自动设置位置你。

running demo http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png