Ситуация: рисунок стопки игральных карт, как в игре Solitaire. Красиво сложены.JLayeredPane с LayoutManager
Для этого я использую JLayeredPane
в сочетании с пользовательской реализацией интерфейса LayoutManager
. Причина использования настраиваемого LayoutManager заключается в том, что ориентация стека варьируется, иногда игральные карты полностью покрывают друг друга, иногда частично, и эта логика кажется хорошей работой для LayoutManager, потому что это в основном сводится к установлению местоположения карты.
Таким образом, LayoutManager
отвечает за установку X- и Y-координат всех компонентов в моем стеке. С другой стороны, JLayeredPane
отвечает за их Z-координаты (через его слои).
Добавление компонента к JLayeredPane
выглядит следующим образом:
JLayeredPane pane = new JLayeredPane();
pane.setLayout(new StackLayout(...));
pane.add(new CardView(...), new Integer(j));
, где new Integer(j)
представляет собой слой карты. Это должно быть Integer
по договору JLayeredPane
.
Проблема заключается в том, что у моего StackLayout
не может быть другого объекта ограничения, кроме Integer
, по причине, указанной выше. Интерфейс LayoutManager
требует реализовать следующий метод:
addLayoutComponent(Component comp, Object constraints);
и проходящее Object
будет здесь всегда быть Integer
.
В моей конкретной ситуации мне повезло, так как мои XY-координаты могут быть рассчитаны на основе Z-координат. Например, карта в слое k
должна быть расположена в координате Y k * offset
. Поэтому в моей ситуации объект ограничений, являющийся Integer
, не является проблемой.
Мне было интересно, что вы должны делать, когда нет никакой корреляции между Z-координатами и XY-координатами? Как вы можете это решить? Например, как использовать GridBagLayout
в сочетании с JLayeredPane
, где первый требует объекта GridBagConstraints
, а второй - объекта Integer
? Конечно, GBL будет компоноваться таким образом, чтобы компоненты не перекрывались, но это всего лишь идея.
Задумывались ли вы о расширении JLayeredPane, так как вам нужно изменить базовое поведение? Таким образом, вы можете создать свой собственный метод добавления, который позволил бы использовать свой собственный параметр Object 2nd, который объединил Integer, требуемый для суперпользователя JLayeredPane, и, возможно, GridBagConstraints, если макет использовал GridBagLayout или что-то подобное. –
@HovercraftFullOfEels Кажется, что это может быть правильное решение. Я думаю, мне может потребоваться переопределить 'protected void addImpl (Component comp, Object constraints, int index)', который 'JLayeredPane' переопределяет сам, чтобы сначала перехватить объект Integer, который используется для определения слоя. Затем он передает ограничения на свой суперкласс «Контейнер», который в конечном итоге ничего не будет с ним делать, поскольку по умолчанию «JLayeredPane» не имеет LayoutManager. Я напишу ответ на этот подход. – Timmos