2009-08-03 4 views
0

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

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

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

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

+0

да ... я сделал текстовые поля 81 ... выглядит круто, требуется время, чтобы ввести его в tho. : P – Victor

ответ

4

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

+0

thx, я посмотрю на это. – ev00l

1

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

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

2

Боролся немного с этим для моего собственного Sudoku Solver, но в конечном итоге будет для живописи на 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()); 
     } 
    }); 
+0

Я бы добавил, что с помощью этого решения вы можете использовать любые девять изображений для своих символов. –

+0

И как дополнительное дополнение: я также использовал его, чтобы показать некоторые подробности о решающем алгоритме; отображение курсора и попыток (и всплывающие подсказки, как вы можете видеть). – Tim

2

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

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

private JTextField[] textFields; 

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

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

для х, у

1

первый путь:

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

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

второй путь:

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

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

+0

Спасибо большое за ваш вклад. – ev00l

1

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

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

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

Результат на данный момент можно посмотреть здесь: Image of my textfields

2

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

Смежные вопросы