JLabel находится в неправильном положении в моей JPanel - PullRequest
1 голос
/ 12 июля 2011

У меня есть класс, который расширяет JPanel, и я хочу добавить некоторые метки (фактически класс, который расширяет JLabel) на нем.Расположение этой панели в нуле.Я установил размер и расположение моей метки, но проблема в том, что я не вижу ее в правильном месте :( Я напечатал 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 ]

2 голосов
/ 12 июля 2011

любой из JComponents должен быть виден, или вам нужно вызвать pack ();в контейнер верхнего уровня , иначе возвращает нулевое значение для getBounds ();или getSize или getWh независимо

0 голосов
/ 12 июля 2011

это может показаться нелепым, но я просто прокомментировал описанные ниже методы, и проблема была решена: O Я действительно не знаю, почему это произошло.я даже не позвонил им: - ??я пытался опубликовать SSCCE и понял, что все в порядке.Поэтому я начал делать свою собственную программу в точности как ту, которую я хотел опубликовать (сделав методы комментарием)

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

эти методы должны были возвращать позицию моих танков.(Они были в классе TankView)

...