首页 > 解决方案 > JFrame中JLabel的Java定位问题

问题描述

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

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);
        }
    }

标签: javaswingjframejlabelbluej

解决方案


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

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

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

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

  5. 您的代码尝试在框架和标签之间留出空间。不。如果你想要额外的空间,你可以EmptyBorder在面板中添加一个。阅读 Swing 教程中关于如何使用边框的部分

  6. 您的代码正在使用 KeyListener。不。Swing 被设计为与键绑定一起使用

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

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

如果您在解决上述问题后需要更多帮助,请发布一个适当的最小、可重现的示例来演示您的新问题。


推荐阅读