Как?рисование пользовательских составных объектов на Java - PullRequest
2 голосов
/ 01 ноября 2011

Я пытался сделать настольную игру в Java, и я застрял со следующей проблемой.

Я хочу создать объект, который можно рисовать в jpanel. Назовем этот объект Board. Эту доску я хочу, чтобы она была составным объектом других досок. Следовательно, когда я вызываю (назовем это) метод paint () для доски, для правильной окраски он должен будет сам вызывать paint, а также вызывать методы paint () его вспомогательных плат и т. Д. Я знаю, что это похоже на уже реализованное поведение (кто-то может сказать ... просто создать Jpanel в Jpanel), но разница в том, что для объекта Board я хочу иметь возможность перетаскивать его в любое место на Jpanel. Кроме того, Jpanel может содержать много досок, которые можно перетаскивать куда-либо внутри (они также могут перекрываться). Так что такого рода поведение ограничивает меня от использования компонентов Java Swing, потому что все они используют макеты, а это не то, что я хочу.

Наконец, когда я добавляю объект платы на доску, координаты, которые я использую, хотят быть относительными к родительской плате, а не к Jpanel. (т.е. когда я добавляю доску B к доске A, и я хочу добавить доску B к (x, y) = (10,10), эти координаты относительно местоположения A)

Это какой-нибудь способ сделать это? Я не ищу полный пример, просто для общих идей (желательно чистых!)

PS. Я реализовал то, что почти работает. Проблема в моей реализации состоит в том, что Graphics g, класс Board, используемый для рисования, взят из JPanel, а координаты x, y относительно JPanel для всех плат (а не родительской платы в случае добавления платы). на материнскую плату, а не напрямую на JPanel).

Я не знаю, является ли это плавким, но я представляю, что листовая доска на самом деле рисует сам с начальными координатами (0,0), которые каким-то образом в JPanel переносятся в (x, y) в зависимости от фактического расположение в Jpanel платы.

Спасибо!

1 Ответ

2 голосов
/ 01 ноября 2011

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

Есть несколько проблем, когда вам необходимо абсолютное позиционирование компонентов или явная установка их размера.

Вот некоторые 2 темы, которые вы могли бы заинтересовать:

  1. Первый обсуждает аналогичную проблему.
  2. Второй объясняет, почему вы не можете напрямую использовать методы setXXXSize в Компоненте.

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

...