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 будет размещаться таким образом, чтобы компоненты не перекрывались, но этоЭто просто идея.