Кнопки J не расположены в том же месте, что и их JPanel - PullRequest
0 голосов
/ 03 февраля 2020

Я сейчас пытаюсь сделать сетку судоку. Поэтому я использую 2 массива (двойные измерения), один из которых содержит все кнопки JButton, а другой - 9 JPanels. Я поместил 9 кнопок в каждую JPanel, я использовал GridLayout (3,3) для каждой JPanel, и все JPanel находятся в большей JPanel, которая также использует gridLayout. Проблема в том, что кнопки находятся внизу окна, поэтому не все они отображаются. Я установил зеленый фон для первой JPanel (содержащей первые 9 кнопок), чтобы увидеть, где она сравнивалась с ее кнопками. И я не могу изменить размеры кнопок или панелей.

Вот экран ЧМИ

Вот код моего класса:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Sudoku extends JFrame implements ActionListener {


    public Sudoku(){
        //Initialise the window and show it
        this.setTitle("Sudoku Solver");
        this.setSize(1000, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel pan = new JPanel();
        pan.setLayout(new GridLayout(3,3));

        //Initialise an array of JPanel
        JPanel[][] jPanelTab = new JPanel[3][3];
        for(int i = 0; i < 3;i++){
            for(int j = 0; j < 3;j++){
                jPanelTab[i][j] = new JPanel();
                jPanelTab[i][j].setLayout(new GridLayout(3,3));
            }
        }


        //Initialise the JButtons
        JButton[][] boutonTab = new JButton[9][9];
        for(int i = 0; i < 9;i++){
            for(int j = 0; j < 9;j++){
                boutonTab[i][j] = new JButton();
                boutonTab[i][j].setText(""+i+"/"+j);
            }
        }


        for(int h = 0; h < 3; h++) {
            int n = 0;
            for (int i = 0; i < 3; i++) {
                int column = 0;
                for (int j = 0; j < 9; j++) {
                    jPanelTab[h][column].add(boutonTab[n][j]);
                    if (j == 2 || j == 5) {
                        column++;
                    }
                }
                n++;
            }
        }

        //Add the 9 JPanels to the JFrame
        for(int i = 0; i < 3;i++){
            for(int j = 0; j < 3;j++){
                if(j == 0 && i == 0)
                    pan.add(jPanelTab[i][j]).setBackground(Color.green);
                else
                    pan.add(jPanelTab[i][j]);

            }
        }
        this.setContentPane(pan);
        this.setVisible(true);

    }

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}

Спасибо за ваши ответы!

1 Ответ

1 голос
/ 03 февраля 2020

При работе с двумерными массивами первый индекс - это строка, а второй - столбец.

Таким образом, использование более подходящих имен переменных может помочь понять логику циклов c. В моем коде ниже я использую переменные, содержащие «r» (строка) и «c» (столбец).

При использовании вышеуказанных имен переменных в циклическом коде вы теперь l oop просматриваете строки перед столбцами, поэтому внешний l oop будет содержать «r» в имени переменной, а внутренний l oop будет содержать «c» в имени переменной.

Надеюсь, когда вы прочитаете код, который станет легче для понимания.

Основное изменение, внесенное в код, - это логика c, которая используется для добавления отдельных кнопок на каждую из 9 панелей.

Обратите внимание, как начальные индексы для кнопок в 3 раза больше индексов для панелей. Индексы столбцов и строк необходимо сбрасывать для каждой третьей кнопки, добавленной на панель.

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

public class Sudoku extends JFrame {

    public Sudoku(){

        //Initialise the window and show it
        this.setTitle("Sudoku Solver");
        this.setSize(1000, 500);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel board = new JPanel();
        board.setLayout(new GridLayout(3,3));

        //Initialise an array of JPanel
        JPanel[][] panels = new JPanel[3][3];
        for (int r = 0; r < 3; r++)
        {
            for (int c = 0; c < 3; c++)
            {
                JPanel panel = new JPanel( new GridLayout(3, 3) );
                panels[r][c] = panel;
                board.add( panel );
            }
        }

        //Initialise the JButtons
        JButton[][] buttons = new JButton[9][9];
        for(int r = 0; r < 9; r++)
        {
            for(int c = 0; c < 9; c++)
            {
                buttons[r][c] = new JButton(r + "/" + c);
            }
        }

        for (int panelR = 0; panelR < 3; panelR++)
        {
            for (int panelC = 0; panelC < 3; panelC++)
            {
                int buttonR = panelR * 3;
                int buttonC = panelC * 3;

                for (int i = 0; i < 9; i++)
                {
                    panels[panelR][panelC].add(buttons[buttonR][buttonC]);
                    buttonC++;

                    if ((i + 1) % 3 == 0)
                    {
                        buttonC = panelC * 3;
                        buttonR++;
                    }
                }
            }
        }

        this.setContentPane(board);
        this.setVisible(true);

    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> new Sudoku() );
    }
}
...