[英]Java: How to nest JPanel in a GridLayout?
我想知道如何使用GridLayout
嵌套JPanel
。 它应该是这样的。
到目前为止,我通过两种方式解决了这个问题,
JPanel
和 JLabel
, 并且它们都没有工作(仅显示创建的第一个面板)。
以下是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]);
一种选择是创建一个类,该类将表示将图像划分为网格的面板。 唯一的问题是左上象限,它通常包含嵌套面板,在某些时候你希望它只包含一个空白面板。 所以也许这样的事情(除了各种优化):
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);
}
}
请注意,它接受要在网格左上角显示的面板。 然后使用指定的面板调用此coud。 所以在你想要创建主面板的时候:
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));
而且优点是你可以根据需要稍微操控图像。
您遇到的一个问题是图像没有缩放。 要缩放图像,请使用Image.getScaledInstance()
。 适当的缩放至少可以解决可见图像被切断的问题。 它也可能导致其他图像显示,因为它们可能只是隐藏在可见图像后面,因为它们太大了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.