使用GridBagLayout构建垄断板

时间:2010-06-14 15:45:03

标签: java swing layout layout-manager

我在业余时间一直在构建一个Java版的Monopoly,并且在浏览Swing的布局等方面遇到了一些麻烦。

我在棋盘上的每个空间基本上都是一个习惯JButton,我一直试图将它们放在框架的边缘(就像垄断板本身一样)。我似乎无法找到有关布局系统如何工作的有用解释,因此遇到了麻烦。

有人可以举个例子说明他们如何在画面边缘放置按钮吗?我应该使用不同的布局吗?

4 个答案:

答案 0 :(得分:3)

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

然后将JPanels添加到BorderLayout.NorthSouthEastWest

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

Here是开始使用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);
...

答案 1 :(得分: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();
    }
}

}

从这里开始,如果你添加一个结构来固定面板,那么你可以为每个面板添加按钮和任何你想要的东西。按钮也可以代替面板。这应该使用正确的导入进行编译,因此请编译并试用。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

它可以让你根据相对间距将事物准确放置在你想要的位置,而不是试图让它解决。