JLabel对另一个JLabel不起作用

时间:2014-09-30 23:39:02

标签: java swing jlabel

我一直试图将JLabel放在另一个上面,用于我的Roguelike。不幸的是,它似乎没有用。到目前为止,这是我的代码:

public void updateDraw(int direction){
    int[] pos = Dungeon.getPos();

    for(int i=pos[1]-(DISPLAY_Y_SIZE/2) ; i<pos[1]+(DISPLAY_Y_SIZE/2) ; i++){
        for(int j=pos[0]-(DISPLAY_X_SIZE/2) ; j<pos[0]+(DISPLAY_X_SIZE/2) ; j++){
            labelGrid[i-(pos[1]-(DISPLAY_Y_SIZE/2))][j-(pos[0]-(DISPLAY_X_SIZE/2))].setIcon(tiles[Dungeon.getMapTile(i,j)].getIcon());      
        }
    }

    labelGrid[DISPLAY_Y_SIZE/2][DISPLAY_X_SIZE/2].add(character);

    this.repaint();
}

我已经阅读了其他问题的解决方案,他们都是通过简单地将JLabel添加到另一个问题来实现的。它在这里没有按预期工作,任何想法为什么?

PS:我不想在我的JPanel中使用JLayeredPane。

1 个答案:

答案 0 :(得分:2)

一个替代

不要使用组件(即JLabel)创建游戏环境。相反,您可以绘制所有游戏对象。

例如,如果您正在执行以下操作:

JLabel[][] labelGrid = JLabel[][];
...
ImageIcon icon = new ImageIcon(...);
JLabel label = new JLabel(icon);
...
for(... ; ... ; ...) {
   container.add(label);
}

您可以将所有标签全部删除,并使用Images代替ImageIcons,然后您可以将所有图像绘制到单个组件表面。也许是这样的:

public class GamePanel extends JPanel {
    Image[][] images = new Image[size][size];
    // init images

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image,/*  Crap! How do we know what location? Look Below */);
    }  
}

因此,为了解决这个问题的位置(即x和y,哦和大小),我们可以使用一些好的旧OOP抽象。创建一个包装图像,位置和大小的类。例如

class LocatedImage {
    private Image image;
    private int x, y, width, height;
    private ImageObserver observer;


    public LocatedImage(Image image, int x, int y, int width, 
                                     int height, ImageObserver observer) {
        this.image = image;
        ...
    }

    public void draw(Graphics2D g2d) {
        g2d.drawImage(image, x, y, width, height, observer);
    }
}

然后,您可以在面板中使用此类的一堆实例。像

这样的东西
public class GamePanel extends JPanel {
    List<LocatedImage> imagesToDraw;
    // init images
    // e.g. imagesToDraw.add(new LocatedImage(img, 20, 20, 100, 100, this));

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g.create();
        for (LocatedImage image: imagesToDraw) {
            image.draw(g2d);
        }
        g2d.dispose();
    }  
}

一旦你掌握了这个概念,就会有很多不同的可能性。