Java 数独图形用户界面问题

Java 数独图形用户界面问题,java,swing,sudoku,Java,Swing,Sudoku,我需要创建一个Suduku游戏板,如下所示: 这是我完成这项任务所需要的条件,但我有一些问题 使用两个for循环来绘制文本字段,而不是清单81中的暴力文本字段。你应该这样做: for (int k = 1; k <= 9; k++) { JPanel level2 = new JPanel(); …. for (int i = 1; i <= 9; i++) { JTextField text

我需要创建一个Suduku游戏板,如下所示:

这是我完成这项任务所需要的条件,但我有一些问题

  • 使用两个for循环来绘制文本字段,而不是清单81中的暴力文本字段。你应该这样做:

        for (int k = 1; k <= 9; k++)
        {
            JPanel level2 = new JPanel();
     ….
            for (int i = 1; i <= 9; i++)
            {
                JTextField text = new JTextField();
                …
            }
            gridPanel.add(level2);
        }
    

    问题是,在我当前的版本中,右菜单水平显示,我看不到网格。此外,我不知道如何添加输出区域

    当使用Swing面对此类框架时,您需要将框架划分为多个部分,并分别进行处理。我的意思是,通过查看图像,您可以轻松识别数独、菜单和输出。因此,您的答案应该首先尝试分别创建它们,然后加入它们

    考虑到这一点,您必须注意:

    • 有3个主要组件:数独、菜单和输出
    • 3个主要组件可能使用
      边界布局
      ,因为它们可能位于西部、东部和南部
    • 数独组件是由3x3个较小网格组成的3x3网格(因此您可以更改黑色边框)
    • 菜单组件是一个5x1网格,每个位置都有按钮
    • 输出组件是单个文本框
    因此,您可能需要更改某些内容以获得准确的行为(按钮大小和边距,难度
    组合框
    上的选项),但您的解决方案应如下所示:

        public class SudokuLayout extends JFrame {
    
        public SudokuLayout() {
            // Create panel for Sudoku
            JPanel board = new JPanel();
            board.setLayout(new GridLayout(3, 3));
            board.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            for (int row = 0; row < 3; ++row) {
                for (int col = 0; col < 3; ++col) {
                    JPanel box = new JPanel(new GridLayout(3, 3));
                    box.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                    for (int cell = 0; cell < 9; ++cell) {
                        box.add(new JTextField(2));
                    }
                    board.add(box);
                }
            }
    
            // Create difficulty combo box
            JComboBox<String> difficultyChoices = new JComboBox<>(new String[] { "Hard", "Easy" });
            difficultyChoices.setSelectedIndex(0);
    
            // Create menu panel
            JPanel menu = new JPanel();
            menu.setLayout(new GridBagLayout());
            GridBagConstraints menuConstraints = new GridBagConstraints();
    
            menuConstraints.anchor = GridBagConstraints.WEST;
            menuConstraints.weightx = 0.5;
            menuConstraints.weighty = 0.5;
            menuConstraints.gridwidth = 2;
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 0;
            menu.add(new JButton("Reset"), menuConstraints);
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 1;
            menu.add(new JButton("Hint"), menuConstraints);
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 2;
            menu.add(new JButton("Solve"), menuConstraints);
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 3;
            menu.add(new JButton("New Puzzle"), menuConstraints);
    
            menuConstraints.weighty = 1.0;
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 4;
            menu.add(new JLabel("Difficulty:"), menuConstraints);
    
            menuConstraints.fill = GridBagConstraints.HORIZONTAL;
            menuConstraints.weightx = 0.5;
            menuConstraints.weighty = 0.5;
            menuConstraints.gridwidth = 2;
            menuConstraints.gridx = 0;
            menuConstraints.gridy = 5;
            menu.add(difficultyChoices, menuConstraints);
    
            // Create output panel
            JTextArea output = new JTextArea(5, 20);
            output.setEditable(false);
            output.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Output Area"));
    
            // Join the 3 panels on the frame
            Container cp = getContentPane();
            cp.setLayout(new BorderLayout());
    
            cp.add(board, BorderLayout.WEST);
            cp.add(menu, BorderLayout.EAST);
            cp.add(output, BorderLayout.SOUTH);
        }
    
        public static void main(String[] args) {
            // Create a frame and set its properties
            JFrame frame = new SudokuLayout();
            frame.setTitle("TestSudoku");
            frame.setSize(600, 600);
            frame.setLocationRelativeTo(null); // Center the frame
    
            // Setup the window
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    
    }
    
    公共类SudokuLayout扩展JFrame{
    公共SudokuLayout(){
    //创建数独游戏面板
    JPanel board=新的JPanel();
    board.setLayout(新网格布局(3,3));
    board.setboorder(BorderFactory.createLineBorder(Color.BLACK));
    对于(int行=0;行<3;++行){
    用于(整数列=0;列<3;++列){
    JPanel框=新的JPanel(新的网格布局(3,3));
    box.setboorder(BorderFactory.createLineBorder(Color.BLACK));
    用于(整数单元格=0;单元格<9;++单元格){
    框。添加(新JTextField(2));
    }
    板。添加(框);
    }
    }
    //创建难度组合框
    JComboBox-difficultyChoices=newjcombobox(新字符串[]{“硬”、“易”});
    困难选择。设置选定的索引(0);
    //创建菜单面板
    JPanel菜单=新建JPanel();
    menu.setLayout(新GridBagLayout());
    GridBagConstraints menuConstraints=新的GridBagConstraints();
    menuConstraints.anchor=gridbagstraints.WEST;
    menuConstraints.weightx=0.5;
    menuConstraints.weighty=0.5;
    menuConstraints.gridwidth=2;
    menuConstraints.gridx=2;
    menuConstraints.gridy=0;
    添加(新JButton(“重置”),菜单约束;
    menuConstraints.gridx=2;
    menuConstraints.gridy=1;
    添加(新JButton(“提示”),菜单约束;
    menuConstraints.gridx=2;
    menuConstraints.gridy=2;
    添加(新JButton(“解决”),菜单约束;
    menuConstraints.gridx=2;
    menuConstraints.gridy=3;
    添加(新JButton(“新拼图”),菜单约束;
    menuConstraints.weighty=1.0;
    menuConstraints.gridx=2;
    menuConstraints.gridy=4;
    添加(新JLabel(“难度”)、菜单约束;
    menuConstraints.fill=GridBagConstraints.HORIZONTAL;
    menuConstraints.weightx=0.5;
    menuConstraints.weighty=0.5;
    menuConstraints.gridwidth=2;
    menuConstraints.gridx=0;
    menuConstraints.gridy=5;
    添加(困难选项、菜单约束);
    //创建输出面板
    JTextArea输出=新的JTextArea(5,20);
    output.setEditable(false);
    setboorder(BorderFactory.createTitleBorder(BorderFactory.createLineBorder(Color.BLUE),“输出区域”);
    //将3个面板连接到框架上
    容器cp=getContentPane();
    cp.setLayout(新的BorderLayout());
    cp.add(线路板,边界布局,西侧);
    cp.add(菜单,BorderLayout.EAST);
    cp.add(输出,边界布局,南部);
    }
    公共静态void main(字符串[]args){
    //创建框架并设置其属性
    JFrame frame=新的SudokuLayout();
    frame.setTitle(“TestSudoku”);
    框架。设置尺寸(600600);
    frame.setLocationRelativeTo(null);//将帧居中
    //设置窗口
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
    }
    }
    

    更新:我用
    GridBagLayout
    菜单和带边框的
    TextArea
    输出来更新我的答案。

    但是我有一些问题
    -你有什么问题?无法理解网格或选择难度。我也不确定如何将按钮移到一边。然后将其添加到问题中,明确您的问题是什么以及您希望得到什么帮助。就目前的情况而言,你的问题仅仅是对你正在努力做的事情的陈述。非常感谢你的帮助。我可以再问你一个问题吗?你知道我怎样才能在按下按钮后创建输出吗?我假设一个if-else语句可能允许这样做,但我不确定如何实现它“我可以再问你一个问题吗?”你可以问尽可能多的问题,但每个问题都应该在一个单独的问题线程上——毕竟这是一个问答网站。如果有助于解决当前问题,请联系我们。@DanielHenrich您可以在按钮创建上实现
    侦听器
    ,也可以修改其他GUI元素。然而,正如Andrew Thompson所说,考虑接受这个问题,问另一个问题,这样我就可以发展更多的问题。
        public class SudokuLayout extends JFrame {
    
        public SudokuLayout() {
            // Create panel for Sudoku
            JPanel board = new JPanel();
            board.setLayout(new GridLayout(3, 3));
            board.setBorder(BorderFactory.createLineBorder(Color.BLACK));
            for (int row = 0; row < 3; ++row) {
                for (int col = 0; col < 3; ++col) {
                    JPanel box = new JPanel(new GridLayout(3, 3));
                    box.setBorder(BorderFactory.createLineBorder(Color.BLACK));
                    for (int cell = 0; cell < 9; ++cell) {
                        box.add(new JTextField(2));
                    }
                    board.add(box);
                }
            }
    
            // Create difficulty combo box
            JComboBox<String> difficultyChoices = new JComboBox<>(new String[] { "Hard", "Easy" });
            difficultyChoices.setSelectedIndex(0);
    
            // Create menu panel
            JPanel menu = new JPanel();
            menu.setLayout(new GridBagLayout());
            GridBagConstraints menuConstraints = new GridBagConstraints();
    
            menuConstraints.anchor = GridBagConstraints.WEST;
            menuConstraints.weightx = 0.5;
            menuConstraints.weighty = 0.5;
            menuConstraints.gridwidth = 2;
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 0;
            menu.add(new JButton("Reset"), menuConstraints);
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 1;
            menu.add(new JButton("Hint"), menuConstraints);
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 2;
            menu.add(new JButton("Solve"), menuConstraints);
    
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 3;
            menu.add(new JButton("New Puzzle"), menuConstraints);
    
            menuConstraints.weighty = 1.0;
            menuConstraints.gridx = 2;
            menuConstraints.gridy = 4;
            menu.add(new JLabel("Difficulty:"), menuConstraints);
    
            menuConstraints.fill = GridBagConstraints.HORIZONTAL;
            menuConstraints.weightx = 0.5;
            menuConstraints.weighty = 0.5;
            menuConstraints.gridwidth = 2;
            menuConstraints.gridx = 0;
            menuConstraints.gridy = 5;
            menu.add(difficultyChoices, menuConstraints);
    
            // Create output panel
            JTextArea output = new JTextArea(5, 20);
            output.setEditable(false);
            output.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Output Area"));
    
            // Join the 3 panels on the frame
            Container cp = getContentPane();
            cp.setLayout(new BorderLayout());
    
            cp.add(board, BorderLayout.WEST);
            cp.add(menu, BorderLayout.EAST);
            cp.add(output, BorderLayout.SOUTH);
        }
    
        public static void main(String[] args) {
            // Create a frame and set its properties
            JFrame frame = new SudokuLayout();
            frame.setTitle("TestSudoku");
            frame.setSize(600, 600);
            frame.setLocationRelativeTo(null); // Center the frame
    
            // Setup the window
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    
    }