【问题标题】:Java: How to nest JPanel in a GridLayout?Java:如何将 JPanel 嵌套在 GridLayout 中?
【发布时间】:2013-12-18 16:04:29
【问题描述】:

我想知道如何使用GridLayout 嵌套JPanels。这就是它应该的样子。

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

  • 使用JPanels 和
  • 使用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]);

【问题讨论】:

标签: java image swing jpanel grid-layout


【解决方案1】:

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

 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 加载图像一次并重复使用图像。例如,您可以在主类中创建这样的 BufferedImage:

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

当你想创建 JLabel 时,你可以这样做:

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

而且好处是你可以根据需要对图像进行一点操作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-17
      • 2017-03-11
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多