【问题标题】:GridLayout stacks all JPanels on first cellGridLayout 在第一个单元格上堆叠所有 JPanel
【发布时间】:2014-05-24 15:24:03
【问题描述】:

我正在尝试为使用 gridLayout 的 JPanel 制作的游戏创建地图。在我的第一个测试中,我使用 5x5 网格并创建我的小面板,它是 JPanel 的子类。我的程序可以很好地创建它们,但是当我将所有面板添加到较大的面板中并显示它时,只显示第一个正方形,其余的为空白。为什么这样做? 这是我的 MapSpace(小面板)代码:

import javax.swing.*;
import java.awt.*;
public class MapSpace extends JPanel{
    private int ownerTag;
    private int xPos, yPos;
    public MapSpace(){
        xPos = 0;
        yPos = 0;
        ownerTag = 0;
        setBackground(Color.WHITE);
    }
public MapSpace(MapSpace m){
        xPos = m.getX();
        yPos = m.getY();
        ownerTag = m.getID();
        setBackground(m.getColor());
    }

这是我的地图代码:

import javax.swing.*;
import java.awt.*;
import java.util.*;
public class Map extends JPanel{
    private int cols, rows;
    private int randCol, randRow;
    private MapSpace[][] spaces;
    Random gen = new Random();
    public Map(int w, int h){
        cols = h;
        rows = w;
        setLayout(new GridLayout(cols, rows));
        setBackground(Color.WHITE);
        spaces = new MapSpace[cols][rows];
        for(int i = 0; i < cols; i++){
            for(int j = 0; j < rows; j++){
                MapSpace panel = new MapSpace(i, j);
                spaces[i][j] = panel;
            }
        }
        assignSpaces(3);
        setColors();
        for(int i = 0; i < cols; i++){
            for(int j = 0; j < rows; j++){
                MapSpace spot = new MapSpace(spaces[i][j]);
                add(spot);
            }
        }
        setSize(400, 400);
    }

第二个嵌套 for 循环是添加所有 mapSpaces 的地方,但是当我将地图放入 JFrame 并在 GUI 窗口中显示时,只出现左上角的一个小方块。

【问题讨论】:

  • Map 类中将MapSpace 替换为JLabel,看看它显示了什么?
  • 否则,创建一个stackoverflow.com/help/mcve,那么这个问题可能会在几分钟内解决。
  • @Braj 我用 JLbael 替换了 MapSpace,它将标签放在窗口上一个漂亮的 5x5 网格中。这是什么意思?

标签: java swing jpanel awt grid-layout


【解决方案1】:

您为什么要尝试使用 MapSpace 的实例创建 MapSpace?

只需使用您想要的参数创建 MapSpace,然后将 MapSpace 同时添加到您的 Array 和面板中。

并在 GUI 窗口中显示,只出现左上角的一个小方块。

可能是因为您没有为 MapSpace 类指定 preferredSize() 大小,因此它默认为 (10, 10),这是使用 FlowLayout 且未添加任何组件的面板的大小。因此,由于您创建了一个 5x5 网格,您可能会看到一个 (50, 50) 白色正方形。

覆盖 MapSpace 类的 getPreferredSize() 以返回每个正方形的默认维度。

【讨论】:

  • 好的,我同时将它添加到面板和数组中,并尝试更改首选大小,但左上角仍然只有一个正方形。有些面板是蓝色的,有些是红色的,因此它在右侧显示一个红色方块和一条蓝线,就像它被放置在蓝色面板上一样。
  • 好吧,我不知道蓝色/红色方块来自哪里,因为您发布的代码仅使用白色。我只能建议您阅读 How to Use GridLayout 上的 Swing 教程以获取一个工作示例。将您的代码与教程进行比较,看看有什么不同。
猜你喜欢
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多