如何设置TicTacToe游戏项目的界面?

时间:2013-04-04 05:23:56

标签: java swing jlabel layout-manager

我正在尝试为Tic tac脚趾制作界面。我在我的9个字段中使用JLabels方法。程序中没有错误,但有一些我不知道该怎么做。请阅读以下我的问题&请给我建议

 import javax.swing.*;
 import java.awt.*;
 import java.awt.geom.*;

 public class ticTac extends JFrame
   {
    static JLabel label0 = new JLabel();
    static JLabel label1 = new JLabel();
    static JLabel label2 = new JLabel();
    static JLabel label3 = new JLabel();
    static JLabel label4 = new JLabel();
    static JLabel label5 = new JLabel();
    static JLabel label6 = new JLabel();
    static JLabel label7 = new JLabel();
    static JLabel label8 = new JLabel();
    static JLabel[] choiceLabel = new JLabel[9];

    static ImageIcon burger = new ImageIcon("Cross.jpg");

 public static void main(String []args)
    {
        new ticTac().show();   
    }

 public ticTac()
    {
        setVisible(true);
        setSize(450,450);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     

        getContentPane().setLayout(new GridBagLayout());
        GridBagConstraints myGrid = new GridBagConstraints();

        GridBagConstraints gridConstraints;
        choiceLabel[0] = label0;
        choiceLabel[1] = label1;
        choiceLabel[2] = label2;
        choiceLabel[3] = label3;
        choiceLabel[4] = label4;
        choiceLabel[5] = label5;
        choiceLabel[6] = label6;
        choiceLabel[7] = label7;
        choiceLabel[8] = label8;

此方法在水平行中将标签从1到9绘制,所以我不希望这样,我希望我的程序将在一行中绘制三个框,在第二行和三个框中绘制三个框。请帮助我。

        for (int i = 0; i < 9; i++)
            {
              gridConstraints = new GridBagConstraints();
              choiceLabel[i].setPreferredSize(new Dimension(burger.getIconWidth(), burger.getIconHeight()));
              choiceLabel[i].setOpaque(true);
              choiceLabel[i].setBackground(Color.RED);
              gridConstraints.gridx = i;
              gridConstraints.gridy = 0;
              gridConstraints.insets = new Insets(10, 10, 10, 10);
              getContentPane().add(choiceLabel[i], gridConstraints);



        pack();
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((int) (0.5 * (screenSize.width - getWidth())), (int) (0.5 * (screenSize.height - getHeight())), getWidth(), getHeight());
    }
}
}

1 个答案:

答案 0 :(得分:3)

您可以使用GridLayout

enter image description here

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import static tictactoe.TicTacToe.choiceLabel;

public class LayoutTicTacToe {

    public static void main(String[] args) {
        new LayoutTicTacToe();
    }

    public LayoutTicTacToe() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridLayout(3, 3, 10, 10));

                choiceLabel[0] = new JLabel("_");
                choiceLabel[1] = new JLabel("_");
                choiceLabel[2] = new JLabel("_");
                choiceLabel[3] = new JLabel("_");
                choiceLabel[4] = new JLabel("_");
                choiceLabel[5] = new JLabel("_");
                choiceLabel[6] = new JLabel("_");
                choiceLabel[7] = new JLabel("_");
                choiceLabel[8] = new JLabel("_");

                for (int i = 0; i < 9; i++) {
                    choiceLabel[i].setText("_");
                    choiceLabel[i].setHorizontalAlignment(JLabel.CENTER);
                    choiceLabel[i].setVerticalAlignment(JLabel.CENTER);
                    choiceLabel[i].setOpaque(true);
                    choiceLabel[i].setBackground(Color.RED);
                    frame.add(choiceLabel[i]);
                }
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

或者,如果你真的被GridBagLayout ...

困住了
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import static tictactoe.TicTacToe.choiceLabel;

public class LayoutTicTacToe {

    public static void main(String[] args) {
        new LayoutTicTacToe();
    }

    public LayoutTicTacToe() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new GridBagLayout());

                choiceLabel[0] = new JLabel("_");
                choiceLabel[1] = new JLabel("_");
                choiceLabel[2] = new JLabel("_");
                choiceLabel[3] = new JLabel("_");
                choiceLabel[4] = new JLabel("_");
                choiceLabel[5] = new JLabel("_");
                choiceLabel[6] = new JLabel("_");
                choiceLabel[7] = new JLabel("_");
                choiceLabel[8] = new JLabel("_");

                GridBagConstraints gbc = new GridBagConstraints();
                gbc.insets = new Insets(10, 10, 10, 10);
                int col = 0;
                int row = 0;
                for (int i = 0; i < 9; i++) {
                    gbc.gridx = col;
                    gbc.gridy = row;
                    choiceLabel[i].setText("_");
                    choiceLabel[i].setHorizontalAlignment(JLabel.CENTER);
                    choiceLabel[i].setVerticalAlignment(JLabel.CENTER);
                    choiceLabel[i].setOpaque(true);
                    choiceLabel[i].setBackground(Color.RED);
                    frame.add(choiceLabel[i], gbc);
                    col++;
                    if (col > 2) {
                        col = 0;
                        row++;
                    }
                }
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }
}

通过反馈进行更新

只是一些友好的反馈...

  • 实际上没有必要扩展JFrame,你没有添加任何重要的功能。最好使用JPanel,然后将其添加到JFrame的实例中。如果不出意外,您现在可以选择将其添加到您喜欢的任何其他容器中。
  • 在大多数情况下,没有必要使用JFrame#getContentPane(除非您使用的是Java 1.4或更低版本),setLayoutadd(在其他一组中)被映射为直接使用getContentPane
  • 如果您想将框架置于屏幕中间,请使用setLocationRelativeTo(null)。它使用起来更简单。如果可以的话,尽量避免使用setBounds
  • 您应该确保使用Event Dispatching Thread的上下文启动UI。有关详细信息,请查看Initial Threads