JLabel在我的JPanel中处于错误的位置

时间:2011-07-11 22:24:45

标签: java swing jpanel jlabel

我有一个扩展JPanel的类,我想在其上添加一些标签(实际上是一个扩展JLabel的类)。此面板的布局为null。我已经设置了标签的大小和位置,但问题是我无法在正确的位置看到它:( 我在控制台中打印了getComponentAt(....)。getClass()。getName()以查看该位置确实存在的内容并得到了正确的答案(我的意思是getComponent表示在我添加它的地方有一个标签,但问题是我看到我的标签在位置(0,0)是错误的): - S. 我在代码中找不到任何错误: - / 任何帮助表示赞赏,提前谢谢。 :) 这是我的代码的相关部分:

public class ServerViewManager extends JPanel implements Serializable {

private ArrayList<String> map;
// *tankview extends JLabel
private ArrayList<TankView> tanks = new ArrayList<TankView>();
private ArrayList<BulletView> bullets = new ArrayList<BulletView>();
private int rows;
private int columns;

public ServerViewManager(ArrayList<String> map) {
    super(null);
    this.map = map;
    rows = map.size();
    columns = map.get(0).length();

    for (int i = 0; i < map.size(); i++) {
        for (int j = 0; j < map.get(i).length(); j++) {
            if (map.get(i).charAt(j) == 'i')
                add(new IceBlock(i, j));
            else if (map.get(i).charAt(j) != 'g')
                add(new Block(map.get(i).charAt(j), i * 50, j * 50));
        }
    }

}

public void paintComponent(Graphics g) {

    g.drawImage(Resources.GROUNDBLOCK.getImage(), 0, 0, columns * 50,
            rows * 50, this);
}
//************************************************
// Here is where i wanna put the label
public void addTank(Color color, int xpos, int ypos) {
    tanks.add(new TankView(color, xpos, ypos));
    if (iceBlock(xpos, ypos)) {
        IceBlock ice = (IceBlock) this.getComponentAt(ypos * 50, xpos * 50);
        ice.putItem(color + "1");
    } else
        this.add(tanks.get(tanks.size() - 1));
    repaint();
}

这是我的标签:

public class TankView extends JLabel implements Serializable{

private int xpos;
private int ypos;
private char direction;
private int directionNum;
private Color color;

public TankView(Color color, int x, int y) {

    xpos=x;
    ypos=y;
    direction='u';
    directionNum=1;

    setLocation(ypos *50, xpos*50);
    setSize(50, 50);
    setOpaque(false);
    setVisible(true);


    this.color=color;
    if (color==Color.Blue)
        setIcon(Resources.BlueTank1);
    else if (color==Color.Green)
        setIcon(Resources.GreenTank1);
    else if (color==Color.Red)
        setIcon(Resources.OrangeTank1);
    else if (color==Color.Yellow)
        setIcon(Resources.PinkTank1);
    repaint();
}

2 个答案:

答案 0 :(得分:2)

JComponents中的任何一个必须是可见的,或者您必须调用pack();到top-level container,否则为getBounds()返回零值;或getSize或getWhatever

答案 1 :(得分:0)

这可能看起来很荒谬,但我只是将下面的方法作为评论,问题就解决了:O 我真的不知道为什么会这样。我甚至没有打电话给他们: - ?? 我试图发布一个SSCCE,我意识到一切都很好。因此,我开始制作我自己的程序,就像我想发布的程序一样(通过制作方法评论)

// public int getX(){
// return xpos;
// }
//
// public int getY(){
// return ypos;
// }

这些方法必须返回我坦克的位置。 (他们在TankView课程中)