Java JLabel在JFrame中的定位问题

Java Positioning Problem of JLabel in JFrame

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

代码解释了我的问题所在。

顺便说一句。我正在使用 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. 代码试图设置组件的 size/location。这意味着您正在使用空布局。不。 Swing 旨在与布局管理器一起使用。你应该使用GridLayout。阅读有关 Layout Managers 的 Swing 教程部分了解更多信息。

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

  3. Swing 组件默认可见,因此不需要 setVisible(true)

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

  5. 您的代码试图在框架和标签之间留下 space。不。如果您想要额外的 space,您可以在面板中添加一个 EmptyBorder。阅读 How to Use Borders

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

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

posted 代码看起来很合理,但是由于我们看不到您在哪里更改标签的背景或在哪里向标签添加图标,我们不知道您的其余部分是什么逻辑在做。问题可能就在那里。

如果您在解决上述问题后需要更多帮助,那么 post 一个适当的 minimal, reproducible example 来演示您的新问题。