Dopasowywanie graficzne komponentu

0

Witam,
Mam dość nie typowy problem i nie wiem do końca jak to ugryźć. Otóż tworzę projekt, który ma drukować kilka komponentów na papierze. Problem polega na tym, że klient może dodać sobie dowolną ich ilość, a wszystkie muszą się znaleźć na jednej stronie. Podszedłem do tego tak:

  1. Stworzyłem JPanel i ustawiłem opaque na false.
  2. Zaprojektowałem wszystko tak, że podczas drukowania tworzone jest przeźroczyste okno, do którego dodawany jest powyższy panel oraz wywoływana funkcja pack() i setVisible(true). Następnie zawartość okna drukowana jest na kontekście graficznym, pochodzącym z interfejsu Printable, okno zostaje zamknięte.

Gdy dodamy do panelu inne komponenty, wówczas ustawiają się na swoje miejsca w kolejności FIFO, a ich rozmiar określany jest na podstawie rozmiaru panela. Szerokość komponentu jest szerokością maksymalną panela, a wysokość komponentu jest to wysokość panela dzielona przez ilość elementów.

Przy dużej ilości komponentów to ich grafika zostaje ucięta, dlatego mam takie pytanie:

Co należy zrobić, aby każdy z tych komponentów był graficznie dopasowany do swoich rozmiarów?

Poniżej umieszczam te rzeczy, które mogą się przydać do bliższego poznania problemu:

Rysunek schematyczny panelu (obecny wygląd):
schemat1.PNG

Rysunek schematyczny panelu (oczekiwany wygląd):
schemat2.PNG

Proszę o pomoc i z góry dziękuję. :D

0

Należy po prostu tak zdefiniować metody paintComponent tych elementów, żeby przy odrysowywały uwzględniały aktualne wymiary. Na przykład jeżeli jakiś komponent ma tło składające się z bitmapy, to powinien go przeskalować i dopiero przeskalowaną wersję odrysowywać. Dobrze zrobiony komponent odrysowuje się sensownie nawet mając wymiary nawet kilku pikseli w pionie i poziomie. Niestety najczęściej można zauważyć, że niektórzy przyjmują jakieś minimalne wymiary dla swojego komponentu. Pół biedy jeżeli taki komponent informuje o swoich minimalnych rozmiarach - wtedy layout manager jest czasem w stanie dobrze rozłożyć komponenty zabierając więcej miejsca, tym które mogą być zmniejszone bez obawy o czytelność. Jeżeli jednak obiektów takich jest zbyt dużo, to i tak dostaniesz efekt taki jaki już otrzymujesz.

0

Próbowałem to zrobić, ale napotkałem na bardzo duży problem. Otóż rozmiary i położenie komponentu ustalane są podczas dodawania komponentu do rodzica. To są te rozmiary, które ucinają dany komponent. Aby przeskalować go muszę znać jego rozmiary przed skalowaniem (czyli te większe) i po skalowaniu (czyli te mniejsze). Nie wiem, skąd wziąć te większe rozmiary. Oczywiście ja zakładam skalowanie przy pomocy BufferedImage, tworząc po prostu obrazek z komponentem w środku i rysując go na kontekście graficznym metodą drawImage, co automatycznie skaluje obraz do podanych rozmarów. Jeśli byłby ładniejszy sposób, który przyniósł by lepsze efekty (to co robi drawImage z BufferedImage podczas skalowania jest straszne) to byłbym wdzięczny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1