GridPane 9x9 с TextField для судоку

Я пытаюсь использовать GridPane для судоку 9x9, используя FXML.

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

Я создал GridPane 9x9, и сейчас я использую TextField в каждом узле для отображения чисел и предоставления пользователю возможности написать новое число самостоятельно.

Мой вопрос:

Можно ли создать 81 TextField's в чистом Java-коде или есть способ сделать это эффективно с помощью FXML, чтобы я не разделял настройку своего представления (модель-представление-контроллер)?

Заранее спасибо и извините, если мой вопрос неясен, мне трудно его объяснить.


person ElloU    schedule 02.03.2016    source источник
comment
Я бы сделал это программно, чтобы в будущем можно было создавать судоку 3x3.   -  person agilob    schedule 02.03.2016


Ответы (1)


Fxml — не единственный (и, на мой взгляд, не лучший способ) использовать шаблон контроллера представления модели в javafx.

Вид в основном описывает, как выглядит приложение/окна/разделы. Это можно сделать с помощью чистого fxml, но очень часто этого будет недостаточно. Особенно, когда вам нужен/нужен динамически выстраиваемый контент (который в вашем случае вам особо и не нужен). Таким образом, вы МОЖЕТЕ просто добавить эти 9 строк сетки и 9 столбцов сетки и добавить в них текстовые поля с помощью FXML. Однако это кажется очень неэффективным, поскольку вы можете использовать циклы и избавиться от многих потерь времени при программировании.

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

Или вы можете использовать чистый код (мой предпочтительный способ, поскольку мне не нравится использовать fxml, если я не могу сделать это только в fxml - и, поскольку это часто имеет место для меня, я просто пропускаю его).

Модель представляет ваши данные. Изменения в этих данных изменят представление. Это делается с помощью наблюдателей и привязок в классе представления.

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


Однако: имейте в виду, что MVC — это всего лишь очень свободный шаблон и не определяет четкий способ сделать это, поскольку он не адаптирован к конкретному языку/фреймворку. Несмотря на то, что существуют учебные пособия, в которых пытаются научить, как реализовать шаблон MVC в JavaFX, все они интерпретируют MVC по-разному, и в результате реализация также сильно отличается.

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

person JohnRW    schedule 02.03.2016
comment
Вау - Большое спасибо! Это был очень сложный ответ, приятель. Я еще не совсем готов отказаться от всего, что я сделал с FXML, но приятно знать, что можно смешивать чистый код Java и fxml, если это необходимо. Позже в будущем я, возможно, решу попробовать сделать все в чистом коде, но простота использования fxml сейчас мне очень помогает. Еще раз большое спасибо за очень хороший ответ! - person ElloU; 04.03.2016
comment
Рад, что смог быть полезен. Бог свидетель, я сам боролся с этим, потому что учебники там плохо объясняют это. Пришлось много читать о mvc и его различных подходах, прежде чем точно знать, как использовать его в контексте javafx. Если этот ответ отвечает на ваш вопрос, проголосуйте за него и выберите его в качестве ответа;) - person JohnRW; 04.03.2016
comment
И материала для чтения так много, что иногда просто теряешься в нем. :) Спасибо, что напомнили мне о выборе ответа - я новичок в stackoverflow ^^ - person ElloU; 04.03.2016
comment
Если вы не возражаете, помогите мне еще раз JohnRW. Я создал свои кнопки с помощью кода Java, и все кажется правильным. Во время создания кнопок я добавляю их в GridPane и использую метод setOnAction, чтобы связать каждую кнопку с методом, который я создал для обработки, когда пользователь нажимает кнопку. Я немного боролся с этим, но потом наткнулся на этот код: button.setOnAction(this::handleActionOnButtonMethod); - person ElloU; 09.03.2016
comment
продолжение handleActionOnButtonMethod — это метод, который я создал для запуска некоторого кода при нажатии кнопки. Он принимает ActionEvent в качестве параметра. По-видимому, это работает, но я никогда раньше не видел такого синтаксиса - this::method. Не могли бы вы объяснить мне, как это работает? :) - person ElloU; 09.03.2016
comment
Этот ответ отвечает на него лучше, чем все, что я мог бы придумать. Но вкратце: это специальный лямбда-синтаксис или, точнее, ссылка на метод: stackoverflow.com/a/20001866/1299690 - person JohnRW; 10.03.2016
comment
Эй, ДжонРВ. Не уверен, что ты получаешь уведомление, когда я пишу сюда, но вот что: я столкнулся с новой проблемой. У меня работают все мои кнопки, и это хорошо, но теперь мне бы очень хотелось, чтобы линия разделяла кнопки на каждые 3 строки и столбца. Как и в обычной игре судоку, вы как бы разделяете каждое поле 3х3. Ты знаешь, что я имею в виду? В любом случае, я попытался решить эту проблему, изучив CSS-стилизацию кнопок. Я думал, что могу стилизовать правильные кнопки в соответствии с границей мысли на соответствующей стороне или, может быть, вставить строку, но я не могу понять, как это сделать. - person ElloU; 26.04.2016