Получить позицию/индекс JPanel в GridLayout?

Я пытаюсь следовать MVC-дизайну и в настоящее время создаю MouseAdapter в своем классе Controller. У меня есть массив того же размера, что и GridLayout в одном из моих классов моделей. Поэтому, когда кто-то щелкает JPanel где-то в сетке, я бы заставил MouseAdapter уведомить модель и что-то сделать. JPanels относятся к другому классу View.

Но для этого мне нужен индекс/позиция этого конкретного JPanel, есть ли способ его получить?

Я проверил методы GetX и GetY MouseEvent, в которых указано:

GetX — возвращает горизонтальное положение x события относительно исходного компонента.

Get Y — возвращает вертикальное положение y события относительно исходного компонента.

По отношению к исходному компоненту означает ли это, что верхний левый угол JPanel равен 0, 0? Как же тогда узнать, какая из панелей в GridLayout была нажата?


person Smooth Operator    schedule 13.01.2011    source источник


Ответы (2)


Поместите необходимую информацию в прослушиватель мыши, который вы добавляете к компоненту. Это проще сделать в настройках, чем при сопоставлении и поиске.

person Tom Hawtin - tackline    schedule 13.01.2011
comment
Как поставить то, чего у меня нет? Я не знаю, какой JPanel будет нажат, поэтому мне нужен индекс. Когда вы добавляете GridLayout, вы делаете что-то вроде setLayout(new GridLayout(8, 8)). Мне нужны эти два числа для конкретной JPanel, по которой щелкнули. Есть ли способ перебрать сетку, как если бы это был массив, используя два цикла for? Тогда, возможно, сравните каждый элемент с event.getSource()? Однако JPanels, вероятно, не уникальны, поэтому могут не работать таким образом. - person Smooth Operator; 13.01.2011
comment
Я бы предпочел организовать это следующим образом: цикл по строкам (и столбцам), вызывающий метод для добавления каждого компонента. for (int row=0; row<rowNum; ++row) { add(row, col); }. Определите add как private void add(final int row, final int col) { Component comp = new Component(); comp.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent event) { ... do something with row and col ... }}); container.add(comp); } - person Tom Hawtin - tackline; 13.01.2011
comment
Хм, это могло бы сработать, но MouseAdapter определен в классе, отдельном от класса с JPanels. Вопрос: два разных JPanel всегда относятся к двум разным объектам, верно? Даже если они одного цвета и т.д.? Потому что тогда я мог бы создать массив JPanel и создать ссылку между каждой JPanel и каждой JPanel, добавленной в GridLayout, а затем просто сравнить getSource() и ссылку и посмотреть, ссылаются ли они на один и тот же объект, и оттуда получить индекс из массива переменных? - person Smooth Operator; 13.01.2011
comment
Я попробовал то, что сказал, но для этого мне пришлось добавить ссылку как на модель, так и на класс представления в моем контроллере, это плохо с точки зрения дизайна MVC? - person Smooth Operator; 13.01.2011

Вы можете создать карту в своем классе просмотра и создать метод

public void getJPanelPos(JPanel panel) 

чтобы получить позицию источника JPanel для события tyhe

person Telcontar    schedule 13.01.2011