将JLabel类绘制到另一个JPanel类的问题

时间:2010-06-09 14:59:15

标签: java swing jpanel paint jlabel

我创建了一个扩展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的任何建议?另外,这是一个很好的方法让照片在游戏中随机漂浮在屏幕上吗?

3 个答案:

答案 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,这样您就可以自己手动将组件放在面板上