Сбор данных из большого количества текстовых полей Swing - PullRequest
0 голосов
/ 04 августа 2009

В настоящее время я пишу решатель судоку на Java. Теперь мне нужен какой-то графический интерфейс Swing для ввода известных чисел. Я создал JFrame, но ручное добавление 81 текстового поля из панели инструментов кажется плохим решением. Я также могу добавить с кодом, как это:

this.setLayout(new GridLayout(9, 9));

for (int i = 0; i < 81; i++)
{
    this.add(new JTextField("Field"));
}

Однако я не знаю, как впоследствии обращаться к этим текстовым полям, чтобы собрать пользовательский ввод в двумерный массив. Как я могу это сделать?

Ответы [ 7 ]

4 голосов
/ 04 августа 2009

Другое решение будет использовать JTable . Вы можете позволить TableModel поддерживать полное решение для обработки данных, а также копию попыток пользователя. CellRenderers и CellEditors могут обрабатывать пользовательский опыт. См. этот урок .

2 голосов
/ 18 октября 2011

Да, это будет работать для отображения массива. Для чтения из массива вам просто нужно вызвать метод getText для каждого элемента.

2 голосов
/ 04 августа 2009

Сначала вам нужно объявить массив JTextFields.

Так же, как ваш массив для хранения пользовательского ввода, вы делаете:

private JTextField[] textFields;

После этого вы можете использовать некоторую математику для сопоставления вашего одномерного массива с вашими двумя измерениями. как то так должно работать:

этаж (индекс / 9), индекс% 9

для х, у

2 голосов
/ 04 августа 2009

Немного боролся с этим для моего собственного решателя судоку, но в итоге пошел рисовать на JPanel и добавил к нему слушатель мыши. Чем определить текущее поле, используя положение мыши с его функцией:

    addMouseListener(new MouseAdapter() {
        private int t(int z) {
            return Math.min(z / factor, 8);
        };

        @Override
        public void mouseMoved(MouseEvent e) {
            setToolTipPossibilities(t(e.getX()), t(e.getY()));
        }

        @Override
        public void mousePressed(MouseEvent e) {
            clickColumn = t(e.getX());
            clickRow = t(e.getY());
        }
    });
1 голос
/ 04 августа 2009

Просто хочу опубликовать небольшое обновление.

Я добавил массив текстовых полей в качестве поля в моей форме:

private JTextField[] fields;

Инициализировал это:

fields = new JTextField[81];

И, наконец, я добавляю поля в форму следующим образом:

    private void addComponents()
{
    this.setLayout(new GridLayout(9, 9));

    for (int i = 0; i < fields.length; i++)
    {
        fields[i] = new JTextField("" + i);
        this.add(fields[i]);
    }
}

Результат на данный момент можно увидеть здесь: Изображение моих текстовых полей

1 голос
/ 04 августа 2009

1-й способ:

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

Проблема с этим методом заключается в том, что, когда вам нужно привязать mouseListener или ActionListener к TextField, вам будет сложно определить, к какому номеру ячейки он соответствует.

2-й способ:

Вы можете расширить JTextField в пользовательский класс с новыми переменными экземпляра, в которых хранится номер ячейки.

Используя этот метод, вы также можете реализовать MouseListener или ActionListener для расширенного класса и получать любую информацию о нужном вам поле, не просматривая свой массив. И объединение с первым, чтобы поместить их в массив, организует их для быстрого доступа.

1 голос
/ 04 августа 2009

JTable твой друг. Используйте DefaultTableModel с редактируемыми значениями String.

String[] columnNames = new String[9];
for(int i=0; i<9; i++){columnNames[i]="";}
String[][] data = new String[9][9]; 
JTable tab = new JTable(columnNames,data);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...