2013-02-13 20 views
18

Tôi có ứng dụng Java Swing hiện có. Ở giữa ứng dụng là một đơn JPanel mà tôi muốn có thể zoom in and out của. Các JPanel có một số JComponents trên nó (chủ yếu là khác JPanelsJLabels).Phóng to JPanel trong Java Swing

Ngoài ra mouse vị trí cũng sẽ cần được điều chỉnh một cách thích hợp - vì vậy mouseevents cần giữ nguyên ngay cả sau khi số JPanel đã được thu nhỏ. Vì vậy, chỉ cần thay đổi phương thức paint của mỗi component dường như không chính đáng.

EDIT:

enter image description here

OK i loại đã nhận nó làm việc bằng cách sử dụng MagnifierUIclass với một số sửa đổi nhỏ. Tuy nhiên bảng phóng to tôi tạo có sai số mouseevents - tức là bảng điều khiển được chia tỷ lệ, mouseevents thì không.

+0

JXLayer có thể thực hiện việc này. Bắt giữ một ví dụ (hoặc thậm chí JXLayer chính nó) là vấn đề bây giờ ngày – MadProgrammer

+0

Tôi nên đề cập đến, tôi đã thử các phương pháp sau đây 1) [Utils4Swing5] (http://javadeveloperslife.wordpress.com/2009/07/18/zooming- swing /) mà không làm việc ở tất cả. 2) Tôi cũng đã thử phương pháp của Peit Blok bằng cách sử dụng JXLayer và PBTransform - tuy nhiên Peit Blok dường như đã rời khỏi hành tinh này và tôi không còn có thể tìm thấy jar cần thiết cho PBTransform [link] (http://www.java.net/node/) 700255) – sboy031

+1

* "Mọi đề xuất?" * Để điều này cho người dùng lựa chọn độ phân giải màn hình hoặc tiện ích phóng to màn hình sẵn có của hệ điều hành. Nếu người dùng cần nó, họ sẽ biết nơi để tìm thấy nó. –

Trả lời

5

Đây chỉ là một scetch:

  • trong bạn theo dõi JPanel giữ của một AffineTransform đại diện cho yếu tố quy mô (xem AffineTransform.scale(double,double),
  • ghi đè các paint phương pháp JPanel của bạn: trước khi gọi super.paint áp dụng affine chuyển đổi thành đối tượng Graphics2D của bạn (truyền từ tham số của phương pháp paint) bằng cách gọi Graphics2D.setTransform(AffineTransform), gọi super.paint sau đó
  • ghi đè các phương thức processMouseEvent, processMouseMotionEventprocessMouseWheelEvent, áp dụng phép biến đổi affine thành tọa độ tham số sự kiện chuột của chúng (AffineTransform.transform(java.awt.geom.Point2D,java.awt.geom.Point2D)), gọi tương ứng super -method sau đó.

Hy vọng điều này sẽ hữu ích.

1

Hãy thử SwingUtilities.convertPoint (nguồn, điểm, đích);