在窗口上设置按钮的位置

时间:2014-11-20 21:57:04

标签: java swing jpanel jbutton layout-manager

作为练习,我一直在尝试制作一个简单的tic tac toe游戏,以了解布局如何在java中工作。现在我已经拥有基本代码,包含所有规则和变量检查,我无法找到如何让按钮按照我想要的方式排列。我想制作一个3x3网格的按钮,但每当我在线尝试教程或找到有类似问题的人时,它总会导致按钮根本不显示。以下代码获取屏幕上的按钮,但不排列它们。

package game;

import java.awt.Color;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JFrame{

    //JPanel
    JPanel pnlMainBoard = new JPanel();

    //Buttons   
    JButton btnTest = new JButton("Test");
    JButton btnAI = new JButton("A1");
    JButton btnBI = new JButton("B1");
    JButton btnCI = new JButton("C1");
    JButton btnAII = new JButton("A2");
    JButton btnBII = new JButton("B2");
    JButton btnCII = new JButton("C2");
    JButton btnAIII = new JButton("A3");
    JButton btnBIII = new JButton("B3");
    JButton btnCIII = new JButton("C3");

    public Main(){
        //Layout
        //pnlMainBoard.setLayout(null);
        //Game set bounds
        btnTest.setBounds(60,400,220,30);       

        //JPanel bounds
        pnlMainBoard.setBounds(800,800,200,100);        

        //Add buttons to frame
        pnlMainBoard.add(btnTest);      
        pnlMainBoard.add(btnAI);        
        pnlMainBoard.add(btnBI);        
        pnlMainBoard.add(btnCI);        
        pnlMainBoard.add(btnAII);       
        pnlMainBoard.add(btnBII);       
        pnlMainBoard.add(btnCII);       
        pnlMainBoard.add(btnAIII);      
        pnlMainBoard.add(btnBIII);      
        pnlMainBoard.add(btnCIII);      
        add(pnlMainBoard);      

        //JFrame Properties
        setSize(400,400);
        setTitle("Ultimate Tic Tac Toe");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);   
    }
    public static void main(String[] args) {
        new Main();
    }

}

到目前为止,这是我创建的唯一一个成功将按钮放在屏幕上的代码,当我更改它时,按钮消失了。我如何制作它以便我可以在窗口上设置我想要它们的按钮的位置?

3 个答案:

答案 0 :(得分:2)

对于3x3网格,请查看可以将JPanel设置为使用的摇摆网格布局:

GridLayout grid = new GridLayout(3,3);
JPanel.setLayout(grid);

其中jpanel是程序中jpanel的名称......

答案 1 :(得分:2)

enter image description here

import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class ThreeByThreeWithButtonLayout {

    private JComponent ui = null;

    ThreeByThreeWithButtonLayout() {
        initUI();
    }

    public void initUI() {
        if (ui != null) {
            return;
        }

        int gap = 10;
        ui = new JPanel(new BorderLayout(4, 4));
        ui.setBorder(new EmptyBorder(4, 4, 4, 4));

        JButton testButton = new JButton("Test");
        JPanel buttonConstrain = new JPanel(
                new FlowLayout(FlowLayout.CENTER, gap, gap));
        buttonConstrain.add(testButton);
        ui.add(buttonConstrain, BorderLayout.PAGE_START);

        JPanel gridPanel = new JPanel(new GridLayout(0, 3, 5, 5));
        gridPanel.setBorder(new EmptyBorder(gap, gap, gap, gap));
        ui.add(gridPanel, BorderLayout.CENTER);
        String[] buttonRows = {"A", "B", "C"};
        for (int ii = 1; ii < 4; ii++) {
            for (String buttonRow : buttonRows) {
                JButton b = new JButton(buttonRow + ii);
                b.setFont(b.getFont().deriveFont(32f));
                gridPanel.add(b);
            }
        }
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {
                }
                ThreeByThreeWithButtonLayout o = new ThreeByThreeWithButtonLayout();

                JFrame f = new JFrame("3x3 + Button");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);

                f.setContentPane(o.getUI());
                f.pack();
                f.setMinimumSize(f.getSize());

                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

答案 2 :(得分:0)

GridLayout为您的框架/面板创建了一些行和列,如下所示:

GridLayout grid = new GridLayout(3,3);
Jpanel.setLayout(grid);