使用GridBagLayout构建一个大富翁棋盘

4
我在业余时间正在构建一个Java版的大富翁游戏,但在使用Swing进行布局等方面遇到了一些困难。
我的棋盘上的每个空格本质上都是自定义的JButton,并且我一直在尝试将它们放置在框架的边缘(就像在大富翁游戏板上一样)。我似乎找不到有用的关于布局系统如何工作的解释,因此我在这方面遇到了麻烦。
请问有人可以给我一个示例,展示如何将按钮放置在框架的边缘?我应该使用不同的布局吗?

感谢您的投票和接受。希望我能帮到您。 - jjnguy
4个回答

3
这似乎最适合与BorderLayout一起使用。我建议创建4个JPanel,它们将包含所有JButton
然后将JPanels添加到BorderLayout.NorthSouthEastWest
这对于按钮的布局可能是最简单的方法。 这里是一个很好的开始使用BorderLayout的地方。
我编写了一些代码,可以帮助您开始进行布局。它还没有被编译。
int boardWidth;
int boardHeight;
int boardSquareHeight;
int boardSqusreWidth;
JPanel north = new JPanel();
JPanel south = new JPanel();
Dimension northSouthD = new Dimension(boardWidth, boardSquareHeight);
north.setPreferedSize(northSouthD);
south.setPreferedSize(northSouthD);
JPanel east = new JPanel();
JPanel west = new JPanel();
Dimension eastWestD = new Dimension(boardSquareHeight, boardHeight - 2 * boardSquaareWidth);
east.setPreferedSize(easWestD);
west.setPreferedSize(easWestD);
// add all of the buttons to the appropriate JPanel
parentPanel.setLayoutManager(new BorderLayout());
parentPanel.add(north, BorderLayour.NORTH);
...

非常感谢。这很好地解释了这些事情的工作方式。 - seadowg

1

我知道这个问题已经有答案了,但我觉得你应该看一下GridLayout的工作原理。首先,http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.htmlhttp://www.cs.ubc.ca/local/computing/software/jdk-1.5.0/docs/api/java/awt/GridBagConstraints.html有助于解密长而神秘的方法签名。

这个大富翁游戏板示例有三个主要部分。第一部分是布局的设置,第二部分是将大中央块添加为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();
    }
}

}

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


好的例子。不过你来得太晚了。:( - jjnguy

0
一个标准的GridLayout可能会起到作用,如果你把“内部”的单元格留空。

我不知道这是可能的...你怎么让单元格保持空白? - seadowg
你只需要添加空容器,例如 new JPanel()new JLabel() - Jack
空的?在我的大富翁游戏棋盘上可没有。免费停车、社区基金和其他卡片——对我来说,它们都在棋盘中央。 - duffymo

0
你可以在NetBeans之类的软件中设计布局,然后使用自动生成的代码(它会从你构建的设计生成间距)来布置自己的面板,只需复制自动生成的代码并用自定义按钮替换占位符所使用的元素即可。
这将允许你根据相对间距精确地放置物品,而不是尝试让Swing自己解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接