Java 使用GridBagLayout构建垄断板

Java 使用GridBagLayout构建垄断板,java,swing,layout,layout-manager,Java,Swing,Layout,Layout Manager,我在业余时间一直在构建垄断的Java版本,在理解Swing的布局等方面遇到了一些困难 我在电路板上的每一个空格本质上都是一个自定义的JButton,我一直试图将它们放在一个框架的边缘(就像在垄断电路板上一样)。我似乎找不到一个关于布局系统如何工作的有用解释,所以我很难做到这一点 有没有人能给我举个例子,说明他们是如何把按钮放在相框边缘的?我应该使用不同的布局吗?如果您将“内部”单元格留空,标准可能会起到作用。这似乎最适合使用标准。我建议创建4个JPanels,其中包含所有JButtons 然后将

我在业余时间一直在构建垄断的Java版本,在理解Swing的布局等方面遇到了一些困难

我在电路板上的每一个空格本质上都是一个自定义的
JButton
,我一直试图将它们放在一个框架的边缘(就像在垄断电路板上一样)。我似乎找不到一个关于布局系统如何工作的有用解释,所以我很难做到这一点


有没有人能给我举个例子,说明他们是如何把按钮放在相框边缘的?我应该使用不同的布局吗?

如果您将“内部”单元格留空,标准可能会起到作用。

这似乎最适合使用标准。我建议创建4个
JPanel
s,其中包含所有
JButton
s

然后将
JPanels
添加到
BorderLayout.North
South
East
West

在我看来,这可能是最简单的按钮布局方式

是开始使用
边框布局
的好地方

我刚刚拼凑了一些代码,可能会帮助您开始设计。它还没有被编译


可以想象,您可以用netbeans之类的东西设计布局,然后使用自动生成的代码(它从您构建的设计中生成间距)来布局您自己的电路板,只需复制自动生成的代码并替换为自定义按钮,而不必使用任何用作占位符的元素


这将允许您根据相对间距准确地将内容放置在您想要的位置,而不是试图让swing计算出来。

我知道这已经得到了回答,但我觉得您应该看看GridLayout是如何工作的。首先,帮助破译长而神秘的方法签名

这个垄断委员会的例子有三个主要部分。有布局的设置,大的中间部分作为一个JPanels的添加,以及外部正方形作为JPanels的添加

public class GridBagLayoutExample extends JFrame {

public static void main(String[] args) {
    new GridBagLayoutExample().setVisible(true);
}

public GridBagLayoutExample() {

    try {
        //Setup the Layout
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        GridBagLayout thisLayout = new GridBagLayout();
        thisLayout.rowWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
                0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
        thisLayout.columnWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
                0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
        getContentPane().setLayout(thisLayout);

        //Default Grid values
        int gridX = 0;
        int gridY = 0;
        //Add Panels for Each of the four sides
        for (int j = 0; j < 4; j++) {
            for (int i = 0; i < 13; i++) {
                JPanel tempPanel = new JPanel();
                switch(j)
                {
                case 0://Top Spaces
                    gridX = i;
                    gridY = 0;
                    break;
                case 1://Left Spaces
                    gridX = 0;
                    gridY = i;
                    break;
                case 2://Right Spaces
                    gridX = 12;
                    gridY = i;
                    break;
                case 3://Bottom Spaces
                    gridX = i;
                    gridY = 12;
                    break;
                }
                getContentPane().add(tempPanel,
                        new GridBagConstraints(gridX,// XGridSpot
                                gridY,// YGridSpot
                                1,// XGridSpaces
                                1,// YGridSpaces
                                0.0, 0.0, GridBagConstraints.CENTER,
                                GridBagConstraints.BOTH,//Fill
                                new Insets(0, 0, 0, 0), 0, 0));
                tempPanel.setBorder(BorderFactory
                        .createLineBorder(Color.BLACK));

            }
        }

        {// Main Inner Area Notice Starts at (1,1) and takes up 11x11
            JPanel innerPanel = new JPanel();
            getContentPane().add(
                    innerPanel,
                    new GridBagConstraints(1,
                            1,
                            11,
                            11,
                            0.0, 0.0,
                            GridBagConstraints.CENTER,
                            GridBagConstraints.BOTH,
                            new Insets(0, 0, 0, 0), 0, 0));
        }
        pack();
        setSize(260, 260);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
公共类GridBagLayoutExample扩展了JFrame{
公共静态void main(字符串[]args){
新建GridBagLayoutExample().setVisible(true);
}
public GridBagLayoutExample(){
试一试{
//设置布局
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
GridBagLayout thisLayout=新的GridBagLayout();
thisLayout.rowWeights=新的双精度[]{0.2,0.1,0.1,0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
thisLayout.columnWeights=新的双精度[]{0.2,0.1,0.1,0.1,
0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
getContentPane().setLayout(thisLayout);
//默认网格值
int gridX=0;
int gridY=0;
//为四个侧面中的每一侧添加面板
对于(int j=0;j<4;j++){
对于(int i=0;i<13;i++){
JPanel tempanel=新的JPanel();
开关(j)
{
案例0://顶部空格
gridX=i;
gridY=0;
打破
案例1://左空格
gridX=0;
gridY=i;
打破
案例2://右空格
gridX=12;
gridY=i;
打破
案例3://底部空间
gridX=i;
gridY=12;
打破
}
getContentPane().add(临时面板,
新的GridBagConstraints(gridX,//XGridSpot
格里迪,//YGridSpot
1,//XGridSpaces
1,//YGridSpaces
0.0,0.0,GridBagConstraints.CENTER,
GridBagConstraints.BOTH,//Fill
新插入(0,0,0,0,0,0),0,0);
tempPanel.setOrder(边界工厂)
.createLineBorder(颜色.黑色));
}
}
{//主要内部区域通知从(1,1)开始,占11x11
JPanel innerPanel=新的JPanel();
getContentPane().add(
内面板,
新的限制条件(1,
1.
11,
11,
0.0, 0.0,
gridbag.CENTER,
两个都是,
新插入(0,0,0,0,0,0),0,0);
}
包装();
设置大小(260260);
}捕获(例外e){
e、 printStackTrace();
}
}
}

从这里开始,如果您添加一个结构来容纳面板,然后您可以向每个面板添加按钮和任何您想要的内容。按钮也可以代替面板工作。这应该使用正确的导入进行编译,所以请编译并试用。

我不知道这是可能的。。。如何使单元格保持空?只需添加空容器,如
newjpanel()
newjlabel()
空?不在我的董事会上。免费停车,社区胸和其他卡-那些是在中间板为我。谢谢投票和接受。希望我能帮忙。非常感谢。这就解释了这些东西的工作方式,很好的例子。不过你来的太晚了<代码>:(
public class GridBagLayoutExample extends JFrame {

public static void main(String[] args) {
    new GridBagLayoutExample().setVisible(true);
}

public GridBagLayoutExample() {

    try {
        //Setup the Layout
        setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
        GridBagLayout thisLayout = new GridBagLayout();
        thisLayout.rowWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
                0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
        thisLayout.columnWeights = new double[] { 0.2, 0.1, 0.1, 0.1, 0.1,
                0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.2 };
        getContentPane().setLayout(thisLayout);

        //Default Grid values
        int gridX = 0;
        int gridY = 0;
        //Add Panels for Each of the four sides
        for (int j = 0; j < 4; j++) {
            for (int i = 0; i < 13; i++) {
                JPanel tempPanel = new JPanel();
                switch(j)
                {
                case 0://Top Spaces
                    gridX = i;
                    gridY = 0;
                    break;
                case 1://Left Spaces
                    gridX = 0;
                    gridY = i;
                    break;
                case 2://Right Spaces
                    gridX = 12;
                    gridY = i;
                    break;
                case 3://Bottom Spaces
                    gridX = i;
                    gridY = 12;
                    break;
                }
                getContentPane().add(tempPanel,
                        new GridBagConstraints(gridX,// XGridSpot
                                gridY,// YGridSpot
                                1,// XGridSpaces
                                1,// YGridSpaces
                                0.0, 0.0, GridBagConstraints.CENTER,
                                GridBagConstraints.BOTH,//Fill
                                new Insets(0, 0, 0, 0), 0, 0));
                tempPanel.setBorder(BorderFactory
                        .createLineBorder(Color.BLACK));

            }
        }

        {// Main Inner Area Notice Starts at (1,1) and takes up 11x11
            JPanel innerPanel = new JPanel();
            getContentPane().add(
                    innerPanel,
                    new GridBagConstraints(1,
                            1,
                            11,
                            11,
                            0.0, 0.0,
                            GridBagConstraints.CENTER,
                            GridBagConstraints.BOTH,
                            new Insets(0, 0, 0, 0), 0, 0));
        }
        pack();
        setSize(260, 260);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}