Sudoku Gui问题

时间:2017-08-07 14:43:17

标签: java swing sudoku

我需要创建一个看起来像这样的Suduku游戏板:

enter image description here

以下是此作业所需的要求,但我遇到了一些问题。

  1. 使用两个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);
        }
    
  2. 我需要2节课 名为TestSudoku的应用程序类和名为SudokuLayout的工作类。

  3. 实现以下可视化小工具并为其编写侦听器。这些小工具具有以下行为:

    • 按钮“重置”---单击该按钮时,程序将清除文本区域,然后将字符串“单击重置按钮!”输出到文本区域。
    • 按钮“提示”---单击按钮时,程序将清除文本区域,然后将字符串“提示按钮单击!”输出到文本区域。
    • Combobox“难度”---当选择一个项目时,程序将清除文本区域,然后将所选项目名称输出到文本区域。
  4. 使用松散耦合的方法(私有侦听器类或专用适配器类)实现侦听器。

  5. 这就是我现在所拥有的......

    import javax.swing.*;
    import javax.swing.border.Border;
    import java.awt.*;
    
    public class SudokuLayout extends JFrame {
    
        public SudokuLayout() {
    
            JPanel board = new JPanel(new GridLayout(9, 9));
            add(board);
    
            JPanel[][] squares = new JPanel[9][9];
    
            Border border = BorderFactory.createLineBorder(Color.BLACK);
    
            for (int row = 1; row < 9; row++) {
                for (int col = 1; col < 9; col++) {
                    squares[row][col] = new JPanel();
                    board.add(squares[row][col]);
                }
            }
    
            JPanel menu = new JPanel();
            menu.add(new JButton("Reset"));
            menu.add(new JButton("Hint"));
            menu.add(new JButton("Solve"));
            menu.add(new JButton("New Puzzle"));
    
            add(menu);
        }
    
        public static void main(String[] args) {
            /** Create a frame and set its properties*/
            JFrame frame = new SudokuLayout();
            frame.setTitle("Sudoku");
            frame.setSize(600, 600);
            frame.setLocationRelativeTo(null); //Center the frame
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setVisible(true);
        }
    }
    

    问题在于,使用我当前的版本,右侧菜单水平显示,我看不到网格。而且,我不知道如何添加输出区域。

1 个答案:

答案 0 :(得分:2)

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

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

  • 有3个主要组件:数独,菜单和输出
  • 3个主要组成部分可能使用BorderLayout,因为它们可能位于WEST,EAST和SOUTH
  • 数独组件是一个3x3网格的3x3小网格(因此您可以更改黑色边框)。
  • 菜单组件是一个5x1网格,每个位置都有按钮
  • 输出组件是单个文本框架

因此,您可能需要更改某些内容以获得确切的行为(按钮大小和边距,难度ComboBox上的选项),但您的解决方案应如下所示:

    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);
    }

}

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