2013-02-13 13 views
18

Mam istniejącą aplikację Java Swing. W środku aplikacji znajduje się pojedynczy JPanel, który chcę mieć w stanie: zoom in and out. Numer JPanel ma na sobie numer JComponents (głównie inne JPanels i JLabels).Powiększ JPanel w Java Swing

Również pozycja mouse musi być odpowiednio dostosowana - aby mouseevents pozostało takie samo, nawet po powiększeniu JPanel. W związku z tym zwykłe zmienianie metod paint nie jest możliwe.

EDIT:

enter image description here

OK ja niby mam to działa przy użyciu MagnifierUIclass z niewielkimi modyfikacjami. Jednak powiększony panel, który utworzę, ma zły kod mouseevents - tj. Panel jest skalowany, mouseevents nie jest.

+0

JXLayer może to zrobić. Zdobycie przykładu (lub nawet samego JXLayera) jest problematyczne teraz dni – MadProgrammer

+0

Powinienem wspomnieć, próbowałem następujących metod 1) [Utils4Swing5] (http://javadeveloperslife.wordpress.com/2009/07/18/zooming- swing /), który w ogóle nie działa. 2) Próbowałem również metody Peit Bloku z wykorzystaniem JXLayer i PBTransform - jednak Peit Blok wydaje się opuścić planetę i nie mogę już znaleźć słoika niezbędnego do PBTransform [link] (http://www.java.net/node/ 700255) – sboy031

+1

* "Wszelkie sugestie?" * Pozostaw to użytkownikowi wybór rozdzielczości ekranu lub wbudowanego narzędzia do powiększania ekranu. Jeśli użytkownik tego potrzebuje, będzie wiedział, gdzie ją znaleźć. –

Odpowiedz

5

To tylko scetch:

  • w torze JPanel utrzymanie w AffineTransform która reprezentuje współczynnik skali (patrz AffineTransform.scale(double,double),
  • zastąpić metodę swojego JPanelpaint: przed wywołaniem super.paint zastosować afiniczne przekształcenie do obiektu Graphics2D (rzutowanie z parametru metody paint) przez wywołanie Graphics2D.setTransform(AffineTransform), wywołanie super.paint następnie
  • zastępują metody processMouseEvent, processMouseMotionEvent i processMouseWheelEvent, zastosuj transformację afiniczną do współrzędnych parametru zdarzenia myszy (AffineTransform.transform(java.awt.geom.Point2D,java.awt.geom.Point2D)), wywołaj odpowiednią metodę super -metodą.

Mam nadzieję, że to pomoże.

1

Wypróbuj SwingUtilities.convertPoint (źródło, punkt, cel);