我正在使用GridBagLayout和GridBagConstraints来创建地图(纹理网格)
但现在我想在不同的纹理之间插入一条边:我想要这样的东西
|-----|-----|-----|
|-----|-----|-----|
|----|-|----|-----|
|-----|-----|-----|
我试过了:
c.gridx = i*5;
c.gridy = j*5;
c.gridwidth = 5;
c.gridheight = 5;
if(right != null && right != currentTexture)
c.gridwidth--;
if(left != null && left != currentTexture){
c.gridx = i*5+1;
c.gridwidth--;
}
但我得到了这个:
我使用相同的纹理,但我希望它们在边缘处切掉1个位置
@ Code-Guru感谢您的关注。我发现了一种解决问题的不同方法:即使用BufferedImage剪切图像。我会将更改发布到我的代码中:
ImageIcon tile = //get texture ...
Image img = tile.getImage();
BufferedImage buff = new BufferedImage(tile.getIconWidth(),tile.getIconHeight(), BufferedImage.TYPE_INT_RGB);
Graphics2D g = buff.createGraphics();
g.drawImage(img,0,0,null);
int w = tile.getIconWidth(), h = tile.getIconHeight();
int x = 0, y = 0;
c = new GridBagConstraints();
c.gridx = i*10;
c.gridy = j*10;
c.gridwidth = 10;
c.gridheight = 10;
c.fill = GridBagConstraints.NONE;
if(right != null && right != texture){
//c.gridwidth--;
c.anchor = GridBagConstraints.WEST;
w -= (int)(res.ordinal()*2.5+2.5);
}
if(left != null && left != texture){
//c.gridx = (i*10)+1;
//c.gridwidth--;
x = (int)(res.ordinal()*2.5+2.5);
w -= (int)(res.ordinal()*2.5+2.5);
if(c.anchor == GridBagConstraints.WEST)
c.anchor = GridBagConstraints.CENTER;
else
c.anchor = GridBagConstraints.EAST;
}
BufferedImage buff2 = buff.getSubimage(x, y, w, h);
JLabel l = new JLabel(new ImageIcon(buff2));
globalMap.add(l, c);
答案 0 :(得分:0)
我认为,您需要从每行有5列的网格开始。然后,对于每一行,您需要指定每个单元格将跨越多少列。
对于示例中的第一行,第二行和第四行,第一个单元格跨越两列,第二个单元格跨越两列,最后一个单元格仅跨越一列。对于第三行,第一,第三和第四个单元格跨越一列,第二个单元格跨越两列。
P.S。您可以使用gridwidth
对象的GridBagConstraints
成员在此处实现我称之为“跨越”的内容。您可以使用构造函数或直接设置它。