GridBagConstraints插入一个移位列?

时间:2013-02-17 00:51:14

标签: java map constraints textures gridbaglayout

我正在使用GridBagLayout和GridBagConstraints来创建地图(纹理网格)

enter image description here

但现在我想在不同的纹理之间插入一条边:我想要这样的东西

|-----|-----|-----|
|-----|-----|-----|
|----|-|----|-----|
|-----|-----|-----|

我试过了:

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--;
}

但我得到了这个:

enter image description here

我使用相同的纹理,但我希望它们在边缘处切掉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);

1 个答案:

答案 0 :(得分:0)

我认为,您需要从每行有5列的网格开始。然后,对于每一行,您需要指定每个单元格将跨越多少列。

对于示例中的第一行,第二行和第四行,第一个单元格跨越两列,第二个单元格跨越两列,最后一个单元格仅跨越一列。对于第三行,第一,第三和第四个单元格跨越一列,第二个单元格跨越两列。

P.S。您可以使用gridwidth对象的GridBagConstraints成员在此处实现我称之为“跨越”的内容。您可以使用构造函数或直接设置它。