当前位置: 首页 > 面试题库 >

JLabel在另一个JLabel上不起作用

楚浩然
2023-03-14
问题内容

我一直在尝试为我的Roguelike游戏添加一个JLabel。不幸的是,它似乎不起作用。到目前为止,这是我的代码

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。


问题答案:

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

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

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 */);
    }  
}
  • Grapchics.drawImage(Image img, int x, int y, int width, int height, ImageObserver observer)

因此,要解决位置问题(即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();
    }  
}

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

  • 请参阅“执行自定义绘画”,以获取有关绘画的一些一般性想法。


 类似资料:
  • 问题内容: 是否可以在另一个JLabel上添加一个JLabel?谢谢。 问题答案: 简短的回答是肯定的,一个是一个,所以它可以接受(A 是的子类)添加到使用方法: 在以上代码中,将添加到中。 但是,从视觉上看,显示了带有文本“ Hello”的标签,因此无法真正看到包含在标签中的标签。 因此,问题就来了,一个人到底想通过在另一个标签之上添加一个标签来完成什么工作。 编辑: 从评论: 好吧,我想做的是

  • 我试图在GUI中显示卡片,我希望重叠卡片以节省空间。然而,我似乎无法让它发挥作用。我目前正在使用MigLayout,但感觉它更像是一个JLabel问题,而不是其他问题。 要把它描述在一个高水平,考虑在现实生活中玩纸牌游戏。当你正常拿牌时,你只需要看到牌的一部分,因此牌的大部分被另一张牌重叠,以此类推,直到最后一张牌完全显示出来,因为上面没有任何东西。我想重叠的方式,只有一部分卡下面显示,然后顶部的

  • 问题内容: 我正在尝试用GUI制作棋盘游戏。我用 播放器的名称创建了一个JLabel,并希望将其用作令牌。然后,我制作了另一个JLabel, 其中包含板的图像。我将两个标签都添加到boardPanel上, 现在,这些标签并排放置。我如何做到这一点, 以使JLabel带有名称而不是并排放置在带有img的JLabel上? 对于包含两个 标签的面板,我应该考虑些什么吗?像某个布局管理器一样? [只是我的

  • 问题内容: 这是我编写的代码: 问题答案: 那是正确的。布局管理器负责根据布局管理器的规则设置组件的位置。因此,在您的情况下,FlowLayout将覆盖组件的位置。 绝对不要对组件的位置进行硬编码。如果有人使用的分辨率小于1024 X 768怎么办?该组件将永远不会显示。 您也不应设置组件的大小。每个组件都有一个首选的大小。对于带有图像的标签,首选尺寸将是图像的尺寸。 阅读布局管理器,并使用适当的

  • 问题内容: 亲爱的大家,我遇到了挥杆相关的问题。由于违反公司政策,我无法共享代码,因此我将尽力解释该问题。 简而言之,我创建了一个扩展包含JLabel的JWindow的类。JLabel的文本是通过计时器对象随机更新的,该计时器对象使用scheduleAtFixedRate方法每50毫秒实例化一个TimerTask。JLabel中的值是通过在一个单独的线程(称为传输线程)中调用一个方法来检索的,该线

  • 问题内容: 因此,我一直在试图弄清楚这一点,却无法弄清楚如何做到这一点。我希望另一个类中的按钮之一可以更改GUI类中JLabel的文本。 这是来自GUI类的代码:`import java.awt.Container; 这里是尝试更改JLabel“错误”的按钮中的代码: 问题答案: 首先,添加具有访问权限的吸气剂,以便您的第二堂课可以访问该字段。就像是, 或(如@MadProgrammer在评论中建