1

我正在尝试为井字游戏制作界面。我正在为我的 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());
    }
}
}
4

1 回答 1

3

你可以使用一个GridLayout

在此处输入图像描述

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如果可以的话,尽量避免使用。
  • 您应该确保您的 UI 是在事件调度线程的上下文中启动的。查看初始线程以获取更多详细信息
于 2013-04-04T05:33:29.847 回答