Java摆动JButton的顺序和大小

cap*_*onk 0 java swing jbutton layout-manager

我正在尝试用java swing创建一个棋盘游戏,但我对布局感到非常困惑.目前我正在尝试创建用户看到的图像.为了做到这一点,我使用了BorderLayout(我只需要使用Border-grid-flow布局),我认为我会在东南西北部放置一些工作人员,并在中心放置基本板.问题是我必须创建使用JButton移动棋子的路径(其余空间应该留空)并且该路径需要具有特定的十字形状:http://i59.tinypic.com/eileys.png和尺寸应该比平常小.对于初学者,我尝试使用带有gridlayout的JPanel(放入中心),但无论我做什么(如setPreferredSize()),按钮都会调整大小以填充空间.这是我的代码.感谢您的时间,任何提示都会有所帮助!编辑:

package projtest1;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Board extends JFrame
{
    public Board()
    {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Border Layout");
        setMinimumSize(new Dimension(1280, 768));
        setSize(1280, 768);  
        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout());
        contentPane.add(new JButton("North"), BorderLayout.NORTH);
        contentPane.add(new JButton("South"), BorderLayout.SOUTH);
        contentPane.add(new JButton("West"), BorderLayout.WEST);
        contentPane.add(new JButton("East"), BorderLayout.EAST);
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(3, 1, 1, 1));
        buttonPanel.setSize(new Dimension (800,800));
        JPanel topButtonPanel = new JPanel();
        JPanel middleButtonPanel = new JPanel();
        JPanel lastButtonPanel = new JPanel();
        topButtonPanel.setLayout(new GridLayout(6, 3, 1, 1));
        middleButtonPanel.setLayout(new GridLayout(3, 15, 1, 1));
        lastButtonPanel.setLayout(new GridLayout(6, 3, 1, 1));
        topButtonPanel.setSize(new Dimension (100,300));
        //topButtonPanel.setMinimumSize(new Dimension (100,300));
        middleButtonPanel.setSize(new Dimension (700,100));
        lastButtonPanel.setSize(new Dimension (100,300));
        for (int i=0; i<18; i++)
        {
            JButton button = new JButton("(" + i + ")");
            button.setFont(new Font("",Font.BOLD,10));
            button.setPreferredSize(new Dimension(4, 4));
            topButtonPanel.add(button);
        }
        for (int i=0; i<45; i++)
        {
            JButton button = new JButton("(" + i + ")");
            button.setFont(new Font("",Font.BOLD,10));
            button.setPreferredSize(new Dimension(4, 4));
            middleButtonPanel.add(button);
        }
        for (int i=0; i<18; i++)
        {
            JButton button = new JButton("(" + i + ")");
            button.setFont(new Font("",Font.BOLD,10));
            button.setPreferredSize(new Dimension(4, 4));
            lastButtonPanel.add(button);
            buttonPanel.add(topButtonPanel);
            buttonPanel.add(middleButtonPanel);
            buttonPanel.add(lastButtonPanel);
        }

        contentPane.add(buttonPanel, BorderLayout.CENTER);
        setContentPane(contentPane);
    }

}
Run Code Online (Sandbox Code Playgroud)

Gam*_*ids 6

我会试着告诉你一种方法来获得这样的董事会:
游戏板
只使用FlowLayoutGridLayout

你需要的第一件事是JPanel包含董事会.如果您愿意,可以使用BorderLayout将其放在Frame的中心.

----------------------
|                     |
|                     |
|                     |
|                     |
|      mainpanel      |
|                     |
|                     |
|                     |
----------------------
Run Code Online (Sandbox Code Playgroud)

我们将给它一个FlowLayout,它可以包含不同大小的其他组件.但是Flowlayout太动态了所以我们需要修复整个面板的大小并设置resizable(false).

根据图片我们计算15x15按钮,所以为了简单起见,我们设置600x600面板的大小(每个Button都有40x40像素)

接下来,我们向面板添加一些其他组件.有一个叫做的swing组件Filler - 它只会填充空白区域,我们需要一些JPanel我们将按钮放入的位置.

----------------------
|       |     |       |
|   1   |  2  |   3   |
|_______|_____|_______|
|       |     |       |
|   4   |  5  |   6   |
|_______|_____|_______|
|       |     |       |
|   7   |  8  |   9   |
|       |     |       |
----------------------
Run Code Online (Sandbox Code Playgroud)

组分1,3,7和9是填料.您可以像这样初始化它们:

 filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240));
 filler3 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240));
 filler7 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240));
 filler9 = new javax.swing.Box.Filler(new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240), new java.awt.Dimension(240, 240));
Run Code Online (Sandbox Code Playgroud)

三维尺寸将确保填充物的最小和最大尺寸为240x240像素.

组件2,4,5,6和8是JPanels.并且需要按以下顺序将它们添加到主面板中:

JPanel panel2 = new JPanel();
JPanel panel4 = new JPanel();
JPanel panel5 = new JPanel();
JPanel panel6 = new JPanel();
JPanel panel8 = new JPanel();

mainPanel.add(filler1);   // component 1
mainPanel.add(panel2);    // component 2
mainPanel.add(filler3);   // component 3

mainPanel.add(panel4);    // component 4
mainPanel.add(panel5);    // component 5
mainPanel.add(panel6);    // component 6

mainPanel.add(filler7);   // component 7
mainPanel.add(panel8);    // component 8
mainPanel.add(filler9);   // component 9
Run Code Online (Sandbox Code Playgroud)

好了,现在我们有基本的组成部分,你可以看到,它们形成某种交叉的......
我们的小组将包含buttons,将所有网格布局

panel2.setLayout(new java.awt.GridLayout(6, 3));
panel4.setLayout(new java.awt.GridLayout(3, 6));
panel6.setLayout(new java.awt.GridLayout(3, 6));
panel8.setLayout(new java.awt.GridLayout(6, 3));
Run Code Online (Sandbox Code Playgroud)

panel5可以忽略..实际上它现在只是我们的填充物.

现在,您创建一个72(!!)的列表,JButtons就像在上面的循环中一样.第18个按钮添加到panel2,接下来的18个按钮添加到panel4,在接下来的18到panel6最后18个按钮panel8.

你有它.

 _____________________________
|           |_|_|_|           |
|           |_|_|_|           |
|           |_|_|_|           |
|           |_|_|_|           |
|           |_|_|_|           |
|___________|_|_|_|___________|
|_|_|_|_|_|_|     |_|_|_|_|_|_|
|_|_|_|_|_|_|     |_|_|_|_|_|_|
|_|_|_|_|_|_|_____|_|_|_|_|_|_|
|           |_|_|_|           |
|           |_|_|_|           |
|           |_|_|_|           |
|           |_|_|_|           |
|           |_|_|_|           |
|___________|_|_|_|___________|
Run Code Online (Sandbox Code Playgroud)