Нужна помощь в организации JTextFields в JFrame

Я делаю программу судоку на java, чтобы изучить некоторые алгоритмы, поэтому я хочу, чтобы пользователь мог вводить нерешенную головоломку судоку. Вот что у меня есть до сих пор, что создает 81 (9x9) ящик:

JTextField input[] = new JTextField[80];
for(int i = 0; i <= 79; i++)
{   
    input[i] = new JTextField();
    input[i].setPreferredSize(new Dimension(30,30));
    f.getContentPane().add(input[i]);
}

Когда я запускаю эту программу, все, что я получаю, это только одно поле ввода. Я знаю, что все текстовые поля инициализированы, созданы и добавлены в jframe. Я знаю, что вам нужно испортить макет, но я не уверен, как это сделать. Любая помощь присваивается.


person Bavly Hanna    schedule 28.01.2012    source источник


Ответы (2)


Используйте JPanel с GridLayout.

Также:

JTextField input[] = new JTextField[80];

Это 80 (а не 81) текстовых полей.

Обновление: (пример кода)

public class SodokuBoardDemo {

    public static void main(String... args) {
        SudokuBoard board = new SudokuBoard();    
        JFrame frame = new JFrame("Sodoku");
        frame.add(board);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);            
        frame.setVisible(true);
    }

    public static class SudokuBoard extends JPanel {

        public SudokuBoard() {
            setBorder(BorderFactory.createLineBorder(Color.GRAY));
            setLayout(new GridLayout(3, 3));
            BoardPart input[] = new BoardPart[9];
            for (int i = 0; i < 9; i++) {
                input[i] = new BoardPart();
                add(input[i]);
            }
        }

        public static class BoardPart extends JPanel {

            public BoardPart() {
                setBorder(BorderFactory.createLineBorder(Color.GRAY));
                setLayout(new GridLayout(3, 3));
                JTextField input[] = new JTextField[9];
                for (int i = 0; i < 9; i++) {
                    input[i] = new JTextField();
                    input[i].setPreferredSize(new Dimension(30, 30));
                    add(input[i]);
                }
            }
        }
    }
}
person Bhesh Gurung    schedule 28.01.2012
comment
Спасибо, отлично сработало, я просто добавил это перед своим циклом: f.setLayout(new GridLayout(9,9)); - person Bavly Hanna; 28.01.2012
comment
Также есть ли способ разделить gridlayout на 9 блоков 3x3, чтобы он выглядел немного горько? - person Bavly Hanna; 28.01.2012
comment
Нет. Вам нужно использовать несколько панелей JPanel. - person Bhesh Gurung; 28.01.2012

Если вы не знаете, как использовать разные Layout, есть отличный учебник в документах Oracle. Если вы хотите освежить в памяти сами компоненты, вы также можете ознакомиться с руководством на них. :)

PS: может быть, я слишком сонный, но похоже, что вы создали 80 текстовых полей, а не 81.

person posdef    schedule 28.01.2012