2013-03-27 2 views
3

Я пытаюсь отображать карты в моем графическом интерфейсе, и я хочу накладывать карты, чтобы сэкономить на пространстве. Однако я не могу заставить его работать. В настоящее время я использую MigLayout, хотя кажется, что это скорее проблема JLabel, чем что-то еще.Показать JLabel частично поверх другого JLabel

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

Текущая проблема заключается в том, что когда я добавляю JLabel в JPanel, он помещает новейшую метку за то, что уже есть. Я хочу, чтобы он был впереди того, что уже существует. Я не могу найти какой-либо метод, который позволяет мне установить, какая метка находится впереди.

Я хочу сделать что-то вроде:

Пут CARD1 в ячейке 0 0 Put Card2 в ячейке 0 0 с транспонированной у позиции Любая область, где обе карты перекрыт имеет Card2 сверху

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

Если это неясно, сообщите мне. Заранее спасибо.

+0

Для этого может потребоваться установить собственный менеджер компоновки. Вы могли бы вырезать его с некоторой работой с GridBagLayout, но я бы предположил, что вам нужно локализовать для любого из существующих менеджеров макетов, чтобы иметь возможность хорошо его поддерживать. – MadProgrammer

+0

Ну, я не вернусь к GridBagLayout, у меня были плохие впечатления от это и я считаю, что это один из самых ужасных менеджеров макетов. У меня было так много проблем с этим, что они были исправлены, просто переделав его в другом менеджере макетов. Я хотел бы продолжать использовать существующий менеджер макета, если это возможно. –

+0

'Я бы хотел, если возможно, использовать существующий менеджер макетов'. Нет, это невозможно. Менеджеры макетов, которые поставляются вместе с JDK, выкладывают компоненты в 2D без перекрытия. В JDK есть один макет, называемый OverlayLayout, но я никогда не мог заставить его работать каким-либо образом, что имеет смысл. – camickr

ответ

6

Похоже, что JPanel наследуется от Container, у которого есть метод setComponentZOrder(), который звучит так, как будто он делает именно то, что вам нужно.

setCompoentZOrder() documentation

+0

+1 для игры с ZOrder. – camickr

+0

Спасибо, это именно то, что мне нужно. Это работает немного неловко, но сейчас у меня это работает, так что все хорошо. –

5

Заканчивать Overlap Layout который объясняет немного больше о том, как работает ZOrder и даже может предоставить вам с менеджером компоновки, чтобы помочь в вашей карточной игре.

+0

+1 за то, что он на месте, несмотря на бесстыдную вставку для вашего собственного Wordpress. – 2013-03-27 05:25:16

+0

Не знал раньше, что такой такой невероятный макет существует для такой работы :-) –