Java Swing Gridlayout: доступ к определенной координате

Я создаю графический интерфейс Java Swing и отформатировал JPanel для использования GridLayout. Мне нужно получить доступ к определенному "ящику" (т.е. определенной координате) сетки, но я не вижу способа сделать это.

Как я могу это сделать?


person kubasub    schedule 06.12.2011    source источник
comment
Есть ли шанс, что вы создаете представление для Ханойских башен?   -  person trashgod    schedule 06.12.2011
comment
нужен доступ к определенному блоку (т. е. определенной координате) сетки 1) Какие функции программы это предоставляет конечному пользователю? Что находится в ячейках сетки?   -  person Andrew Thompson    schedule 06.12.2011
comment
@trashgod нет, я не работаю с Towers of Hanoi, хотя я делаю графический интерфейс для игры.   -  person kubasub    schedule 06.12.2011
comment
@Andrew Thompson Это позволяет игрокам игры, которую я делаю, видеть, попали они или промахнулись в ячейке, которую они угадали. Это будет отмечено JLabel O   -  person kubasub    schedule 06.12.2011


Ответы (2)


Вы не должны полагаться на код GUI (представление) для получения информации о данных программы (модели). Лучшим решением было бы «знать», где какой компонент находится с самого начала — возможно, у вас должна быть структура данных (2D-массив?), которая содержит компоненты и обновляется всякий раз, когда что-то добавляется в сетку.

Однако, если вам нужно быстрое и очень грязное решение, вы можете начать играть в игры с JPanel.getComponentAt(). Однако для этого требуются пиксельные координаты, поэтому вам потребуется провести обратный инжиниринг, чтобы выяснить, сколько места занимает данный квадрат сетки. Пространство между квадратами сетки задается вашим GridLayout объектом. Однако это не рекомендуется. Я просто включаю его в интересах полноты (и поскольку это более буквальный ответ на ваш вопрос).

person tsm    schedule 06.12.2011
comment
Ладно, кажется, я знаю, что я делал не так. Я просто добавлял кучу JLabels, чтобы заполнить сетку X, а затем, когда игроки угадывали определенные координаты, X превращались в числа. Однако я не хранил JLabels в какой-либо структуре данных. Сейчас попробую, спасибо! - person kubasub; 06.12.2011
comment
@KubaSub, не храните JLabels ... вы снова будете смешивать модель и представление. Сделайте игру играбельной без графического интерфейса, затем добавьте в игру графический интерфейс... таким образом у вас не будет соблазна использовать компоненты пользовательского интерфейса в качестве данных или хранилищ данных. - person Paul; 06.12.2011
comment
@Paul поднимает хороший вопрос; см. также этот пример MCV. - person trashgod; 06.12.2011
comment
Спасибо за вашу помощь, к сожалению, я уже выполнил задание MCV, прежде чем читать, чтобы не хранить этикетки. Просто чтобы я понял, что именно вы имели в виду, имея 2D-массив, который содержит мои компоненты? Должно быть, я неправильно понял. - person kubasub; 10.12.2011
comment
Допустим, у вас есть класс Mark, в котором хранится X или O. Чтобы представить данное игровое состояние, вы могли бы иметь такой 2D-массив: соответствующий символ. Итак, у вас есть модель — набор Marks — и представление — JLabels. - person tsm; 10.12.2011

В GridLayout "Контейнер разделен на прямоугольники одинакового размера». Вы можете добавить пустой прозрачный компонент в места, где вы хотите, чтобы они казались пустыми, например. new JLabel(""). См. также GridBagLayout и Использование менеджеров макетов.

person trashgod    schedule 06.12.2011
comment
Вы можете почерпнуть некоторые идеи из этой игры, в которой используется сетка переключателей. - person trashgod; 06.12.2011