JFrame中JLabel的Java定位问题

问题描述

我正在用JLabels创建一个TileMap,我的问题是最后一个Tile没有正确放置。 由于某种原因,最后一个JLablel处于错误的位置。我认为这张图片:

https://i.stack.imgur.com/0KpSb.png

《守则》解释了我的问题所在。

顺便说一句。我正在使用BlueJ(也许其中有一个错误,我不知道)

感谢帮助!

    //create Frame
    this.setSize((size+2)*imageSize+16,(size+2)*imageSize+39);
    this.addKeyListener(this);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.getContentPane().setBackground(Color.black);
    this.setVisible(true);
    //create MapJLabels
    for(int x = 0;x<size;x++){
        for(int y = 0;y<size;y++){
            mapJLabels[x][y] = new JLabel();
            this.add(mapJLabels[x][y]);
            mapJLabels[x][y].setSize(imageSize,imageSize);
            mapJLabels[x][y].setLocation((x+1)*imageSize,(y+1)*imageSize);
            mapJLabels[x][y].setVisible(true);
        }
    }

解决方法

  1. 代码正在尝试设置组件的大小/位置。这意味着您正在使用空布局。别。 Swing旨在与布局管理器一起使用。您应该使用GridLayout。阅读Layout Managers上Swing教程中的部分,以获取更多信息。

  2. 您创建一个空的JLabel。默认情况下,JLabel是透明的。我不确定现在发布的图片是根据发布的代码创建的。我看不到如何用图像等填充网格。

  3. 默认情况下,Swing组件是可见的,因此无需setVisible(true)

  4. 您的代码尝试设置框架的大小。再次,不要。使用布局管理器时,您只需pack()即可自动计算框架和尺寸。

  5. 您的代码尝试在框架和标签之间留出空间。别。如果需要更多空间,可以在面板上添加EmptyBorder。阅读关于How to Use Borders

    的Swing教程中的部分
  6. 您的代码正在使用KeyListener。别。 Swing旨在与Key Bindings

    一起使用
  7. 在框架可见之前,应将组件添加到框架中。

发布的代码看起来很合理,但是由于我们看不到更改标签背景的位置或在标签上添加图标的位置,因此我们不知道其余逻辑的作用。问题可能在那里。

如果在解决上述问题后需要更多帮助,请张贴适当的minimal,reproducible example来说明您的新问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...