我有一个扩展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();
}
答案 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课程中)