Java 如何为我的数独游戏制作GUI?(摇摆)

Java 如何为我的数独游戏制作GUI?(摇摆),java,swing,sudoku,Java,Swing,Sudoku,到目前为止,我已经编写了生成随机9x9 Soduku网格的代码。我是Java的初学者,所以我有一些关于如何做UI的问题 显示数字的最佳方式是什么?我尝试创建81个JTextFields,这非常乏味,我相信有一种有效的方法可以做到这一点。也许将jtextfields存储在一个数组中?或者我应该使用与jtextfields不同的东西吗 创建网格线的最佳方法是什么?我有一些不同的想法,但可能有不太复杂的方法 考虑使用JLabels的9x9数组: import java.awt.BorderLayout

到目前为止,我已经编写了生成随机9x9 Soduku网格的代码。我是Java的初学者,所以我有一些关于如何做UI的问题

  • 显示数字的最佳方式是什么?我尝试创建81个JTextFields,这非常乏味,我相信有一种有效的方法可以做到这一点。也许将jtextfields存储在一个数组中?或者我应该使用与jtextfields不同的东西吗

  • 创建网格线的最佳方法是什么?我有一些不同的想法,但可能有不太复杂的方法


  • 考虑使用
    JLabel
    s的9x9数组:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.util.Random;
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingConstants;
    
    public class Soduko {
    
        private Cell[][] cells;
        private static final int SIZE = 9, GAP = 2;
        private final JFrame jFrame;
    
        public Soduko() {
    
            jFrame = new JFrame("Soduko");
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jFrame.setLocationRelativeTo(null);
            buildUi();
            jFrame.pack();
            jFrame.setVisible(true);
        }
    
        void buildUi() {
    
            JPanel gridPanel = new JPanel();
            gridPanel.setLayout(new GridLayout(SIZE, SIZE, GAP, GAP));
            gridPanel.setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
            jFrame.add(gridPanel, BorderLayout.CENTER);
    
            cells = new Cell[SIZE][SIZE];
            Random rand = new Random();
            for(int row=0; row <cells.length; row++) {
                for(int col=0; col<cells[row].length; col++) {
                    Cell cell = new Cell(rand.nextInt(SIZE+1)); //initialize with random number for demo
                    cells[row][col] = cell;
                    gridPanel.add(cell);
                }
            }
    
            jFrame.add(new JLabel("Help:           "),  BorderLayout.SOUTH);
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(()-> new Soduko()); 
        }  
    
    class Cell extends JLabel {
    
        private static int CELL_H =35, CELL_W = 35;
    
        Cell(int value) {
            super(String.valueOf(value));
            setHorizontalAlignment(SwingConstants.CENTER);
            setBorder(BorderFactory.createLineBorder(Color.BLUE));
            setPreferredSize(new Dimension(CELL_H , CELL_W));
            setOpaque(true);
        }
    }
    
    导入java.awt.BorderLayout;
    导入java.awt.Color;
    导入java.awt.Dimension;
    导入java.awt.GridLayout;
    导入java.util.Random;
    导入javax.swing.BorderFactory;
    导入javax.swing.JFrame;
    导入javax.swing.JLabel;
    导入javax.swing.JPanel;
    导入javax.swing.SwingConstants;
    公务舱所渡子{
    专用小区[][]小区;
    私有静态最终整数大小=9,间隙=2;
    私有最终JFrame-JFrame;
    公共所渡子(){
    jFrame=新jFrame(“Soduko”);
    jFrame.setDefaultCloseOperation(jFrame.EXIT_ON_CLOSE);
    jFrame.setLocationRelativeTo(空);
    buildUi();
    jFrame.pack();
    jFrame.setVisible(true);
    }
    void buildUi(){
    JPanel gridPanel=新的JPanel();
    setLayout(新的GridLayout(大小、大小、间隙、间隙));
    setboorder(BorderFactory.createEmptyBorder(GAP,GAP,GAP,GAP));
    添加(gridPanel,BorderLayout.CENTER);
    单元格=新单元格[大小][大小];
    Random rand=新的Random();
    
    对于(int row=0;row)每当您有大量的某些UI组件时,尤其是当它们位于固定大小的矩阵中时,二维数组通常是最好的数据结构。要创建网格线,只需在文本字段周围添加边框。请参见main,您还应调用
    new Soduko();
    从事件调度程序线程中,使用
    javax.swing.SwingUtilities.invokeLater()
    @sleepToken避免不必要的行为。您是对的。我添加了它。通常出于简洁或懒惰的原因而忽略它(0: