Java:如何在GridLayout中嵌套JPanel?

Java:如何在GridLayout中嵌套JPanel?,java,image,swing,jpanel,grid-layout,Java,Image,Swing,Jpanel,Grid Layout,我想知道如何使用GridLayout嵌套JPanels。应该是这样的 到目前为止,我通过两种方式解决了这个问题 使用JPanels和 使用JLabels 它们都不起作用(只显示创建的第一个面板) 以下是JPanel方法的代码: int x=20, y=20; JPanel [] panels = new JPanel[3]; JLabel animal = new JLabel(new ImageIcon(getClass().getResource("Pictur

我想知道如何使用
GridLayout
嵌套
JPanel
s。应该是这样的

到目前为止,我通过两种方式解决了这个问题

  • 使用
    JPanel
    s和
  • 使用
    JLabel
    s
它们都不起作用(只显示创建的第一个面板)

以下是
JPanel
方法的代码:

    int x=20, y=20;
    JPanel [] panels = new JPanel[3];
    JLabel animal = new JLabel(new ImageIcon(getClass().getResource("Pictures/animal.gif")));
    JLabel map = new JLabel(new ImageIcon(getClass().getResource("Pictures/map.gif")));
    JLabel mountain = new JLabel(new ImageIcon(getClass().getResource("Pictures/mountain.gif")));

    for(int i=0;i<panels.length;i++)
    {
        if(i>0)
        {
            x+=x;
            y+=y;
        }
        panels[i] = new JPanel(new GridLayout(2,2));
        panels[i].setPreferredSize(new Dimension(x,y));

        if(i==0)
            panels[i].add(new JPanel());

        else
            panels[i].add(panels[i-1]);

        panels[i].add(mountain);
        panels[i].add(map);
        panels[i].add(animal);
    }       
    add(panels[2]);
intx=20,y=20;
JPanel[]面板=新JPanel[3];
JLabel-animal=newjlabel(新的图像图标(getClass().getResource(“Pictures/animal.gif”));
JLabel map=newjlabel(新的图像图标(getClass().getResource(“Pictures/map.gif”));
JLabel mountain=newjlabel(新的图像图标(getClass().getResource(“Pictures/mountain.gif”));
对于(int i=0;i0)
{
x+=x;
y+=y;
}
面板[i]=新JPanel(新网格布局(2,2));
面板[i].setPreferredSize(新尺寸(x,y));
如果(i==0)
面板[i]。添加(新的JPanel());
其他的
面板[i]。添加(面板[i-1]);
面板[i]。添加(山区);
面板[i]。添加(地图);
面板[i]。添加(动物);
}       
添加(面板[2]);

您遇到的一个问题是图像没有缩放。要缩放图像,请使用
Image.getScaledInstance()
。适当的缩放至少可以解决可见图像被切断的问题。它还可能导致显示其他图像,因为它们可能只是隐藏在可见图像后面,因为它们太大了。

一个选项是创建一个类,该类将表示一个面板,该面板与图像一起划分为网格。唯一的问题是左上方的象限,它通常包含嵌套面板,在某个点上,您希望它只包含一个空白面板。所以可能是这样(除非进行各种优化):

请注意,它接受将显示在栅格左上角的面板。然后可以使用指定的面板调用此函数。因此,在要创建主面板的位置:

   JPanel grid = new GridPanel(new JPanel()); //initial
    for(int i = 1; i <= 5; i++){
        grid = new GridPanel(grid);
    }
    add(grid);
当您想要创建JLabel时,可以执行以下操作:

  mountain = new JLabel(new ImageIcon(mountainImg));

其优点是,如果您愿意,您可以稍微操纵图像。

当前显示的是什么?我只添加了最后一个JPanel,因为我认为其他面板都添加到了它。。。
  BufferedImage mointainImg = ImageIO.read(new File("pictures/mountain.gif"));
  mountain = new JLabel(new ImageIcon(mountainImg));