2009-02-19 31 views
5

Tôi có thói quen vẽ biểu đồ cực kỳ lớn bên trong ngăn cuộn. Nó quá lớn để vẽ trước khi thêm vào scrollpane - các yêu cầu về menory sẽ là một vài hợp đồng biểu diễn.Tại sao kết quả jscrollpane của tôi lại tạo ra các cuộc gọi sơn lẻ trong java swing?

Do kích thước của biểu đồ tôi vẽ biểu đồ trong phương pháp vẽ của con của con trỏ. Tuy nhiên, tôi nhận thấy rằng mỗi khi một thanh cuộn được di chuyển thì thường trình vẽ của tôi được gọi là hai lần - một lần với một đường cắt ngang bằng với vùng không bị che khuất, và lần thứ hai với phần cắt bằng kích thước của khung nhìn .

Ví dụ, nếu khung nhìn của tôi là 245x195 & tôi di chuyển xuống bởi 3 pixel thói quen sơn của tôi được gọi với g.getClipBounds() bộ như sau:

java.awt.Rectangle[x=0,y=195,width=245,height=3] 
java.awt.Rectangle[x=0,y=3,width=245,height=195] 

... bởi vì tôi làm trong thói quen sơn này đang gây ra chập chờn (Tôi làm calcs nhanh nhất có thể, nhưng có một chút chậm trễ). Câu hỏi:

  1. Có ai biết cách ngăn chặn cuộc gọi sơn thứ 2 không? Đây là công cụ JScrollPane đơn giản mà tôi đang làm ở đây - Tôi có một thành phần, tôi thêm nó vào scrollpane, tôi thêm scrollpane vào thành phần cha. Bạn có thể thấy hành vi này ngay cả trong bản trình diễn cuộn hình ảnh đầu tiên @the swing tutorial.

  2. Nếu câu trả lời cho # 1 là 'không': ai cũng có thể nghĩ ra cách tốt để giải quyết vấn đề này? Tôi có nên vẽ một số loại đệm hình ảnh, theo dõi các cuộc gọi sơn gần đây & sao chép hình ảnh nếu có thể? Tôi không thể tưởng tượng điều này nhanh hơn nhiều so với hiển thị lại, nhưng mọi thông tin chi tiết đều đánh giá cao :-)

Trả lời

4

Tôi đã gặp sự cố này trong thế giới .NET. Đệm đôi nên giải quyết vấn đề của bạn.

Nếu bạn đang kết xuất trực tiếp lên bề mặt được hiển thị trên màn hình, bạn không thể kiểm soát khi "hiển thị" thực sự xảy ra. Điều thường xảy ra là: bạn bắt đầu hiển thị, hình ảnh chưa hoàn thành đang được hiển thị trên màn hình, bạn hoàn thành hiển thị và sau đó hiển thị cuối cùng trên màn hình.

Nếu bạn bắt đầu logic hiển thị của mình bằng cách xóa thành màu nền, thì điều này sẽ xuất hiện giống như đèn flash. Đệm đôi ngăn chặn điều này bởi vì nó luôn hiển thị từ một kết xuất hoàn thành. Điều tồi tệ nhất có thể xảy ra là hơi 'rách' nhưng điều đó chỉ đáng chú ý trong việc thay đổi hình ảnh động nhanh chóng.

Thậm chí nếu bạn chỉ muốn hiển thị một phần của hình ảnh khổng lồ, bạn vẫn có thể sử dụng kỹ thuật này. Chỉ cần hiển thị những gì bạn cần trên bề mặt ngoài màn hình (kích thước của phần hiển thị mà bạn muốn). Và sau đó khi bạn đã hoàn tất, hãy vẽ toàn bộ hình ảnh lên bề mặt hiển thị của bạn trong một lần ngã.

+0

vấn đề duy nhất của tôi là tôi không thể đệm toàn bộ hình ảnh - quá lớn. Điều này có nghĩa là tôi cần phải giữ các phần đệm khi chúng được vẽ, kiểm tra vùng phủ sóng khi tôi được gọi sơn() và may chúng lại với nhau khi cần thiết. Tôi đoán tôi sẽ cho nó một cảnh quay, nhưng tôi sẽ giữ lại để xem liệu có ai khác có ý tưởng nào không? –

+0

Tốt, việc tăng gấp đôi bộ đệm vẫn có thể phát huy tác dụng. Chỉ cần hiển thị những gì bạn cần trên bề mặt ngoài màn hình (kích thước của phần hiển thị). Và sau đó khi bạn đã hoàn tất, hãy vẽ toàn bộ hình ảnh lên bề mặt hiển thị của bạn trong một lần ngã. – colithium

+0

thực sự, công trình này.Cảm ơn :-) Cuộn chậm hơn một chút, nhưng nhấp nháy đã biến mất. Xin lỗi tôi đã không nhận được nó @ đầu tiên - ngu ngốc của tôi là không phù hợp cho sự kiên trì của bạn ;-) –

Các vấn đề liên quan