有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

图像Java:如何在GridLayout中嵌套JPanel?

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

enter image description here

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

  • 使用JPanel
  • 使用JLabels

它们都不起作用(只显示创建的第一个面板)

以下是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]);

共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

     class GridPanel extends JPanel{
    
        JLabel mountain, map, animal;
    
        public GridPanel(JPanel panel){
            super();
            setLayout(new GridLayout(2, 2));
            animal = new JLabel(new ImageIcon(getClass().getResource("pictures/animal.gif")));
            map = new JLabel(new ImageIcon(getClass().getResource("pictures/map.gif")));
            mountain = new JLabel(new ImageIcon(getClass().getResource("pictures/mountain.gif")));
            add(panel);
            add(mountain);
            add(map);
            add(animal);
        }
    
    }
    

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

       JPanel grid = new GridPanel(new JPanel()); //initial
        for(int i = 1; i <= 5; i++){
            grid = new GridPanel(grid);
        }
        add(grid);
    

    初始网格是使用空白JPanel创建的。每个后续网格将包含前一个网格作为左上面板。你必须调整你的图片大小,甚至可能避免多次加载图片等等,但这是另一个问题。此示例显示5个嵌套面板

    为了清楚起见,您应该使用ImageIO加载图像一次并重用图像。例如,您可以在主类中创建如下BuffereImage:

      BufferedImage mointainImg = ImageIO.read(new File("pictures/mountain.gif"));
    

    当您想要创建JLabel时,可以执行以下操作:

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

    它的优点是,如果你愿意,你可以稍微操纵一下图像