将 JLabel 类绘制到另一个 JPanel 类时出现问题

发布于 2024-09-05 03:21:02 字数 1254 浏览 4 评论 0原文

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

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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你在我安 2024-09-12 03:21:02

首先,不需要扩展 JLabel 来执行此操作。

a) 在将图像添加到标签后,可以使用以下方法设置标签的大小:

label.setSize( label.getPreferredSize() );

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

label.setLocation(...);

c) 如果您想增加位置,您可以使用以下内容:

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

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

panel.setPreferredSize() 

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

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

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.

烟─花易冷 2024-09-12 03:21:02

是的,您应该将 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 会自动为您设置位置。

运行演示 http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png< /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 http://img444.imageshack.us/img444/2567/capturadepantalla201006c.png

想挽留 2024-09-12 03:21:02

我认为主要问题是您没有真正将图像添加到构造函数中的 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() 方法。这就是你可以随机移动它的方法。

另外,在要添加 HeadJPanel 中,您需要确保将 LayoutManaer 设置为 null,以便您可以手动放置自己在面板上的组件。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文