2009-12-22 45 views
10

Từ sun's documentationTại sao phương thức in của java Printable được gọi nhiều lần với cùng một số trang?

"Hệ thống in có thể yêu cầu một trang được hiển thị nhiều lần trước khi chuyển sang trang tiếp theo".

Các ví dụ luôn hiển thị một cái gì đó như thế này:

Printable print(Graphics g, PageFormat pageFormat, int page) { 
    if (page == 0) 
     do... 
    else if(page == blah...) 
} 

Nếu bạn làm theo mô hình này mã của bạn thường hoạt động tốt vì nó là rõ ràng dựa trên số trang. Không theo mô hình này đã khiến tôi đau đớn lớn cho đến khi tôi nhận ra nó đã được gọi nhiều lần với cùng một số trang và bắt đầu cache các trang.

Tại sao phương thức in của java Printable được gọi nhiều lần với cùng một số trang?

Trả lời

13

Hệ thống in Java là lòng thương xót của hệ thống in ấn hệ điều hành cơ bản và hệ thống đó có thể yêu cầu một trang được hiển thị nhiều lần.

Một lý do là in dải - nếu máy in không có đủ bộ nhớ để hiển thị toàn bộ trang cùng một lúc - trong trường hợp đó, hệ điều hành sẽ yêu cầu Java lại cho trang để nó có thể in trang trong dải ("dải"). Đây là trường hợp cụ thể được đề cập trong Hướng dẫn lập trình Java 2D, trong phần "Printing Concepts".

Có thể có các lý do khác; nó thực sự là hệ thống in ấn của hệ điều hành.

+0

Tôi nên lưu ý rằng tôi không thực sự nhớ lại khi nhìn thấy hành vi này khi tôi đang làm việc trên một hệ thống báo cáo dựa trên Java cách đây vài năm. Nó có thể là bởi vì chúng tôi đã trên Linux vào thời điểm đó. – ZoogieZork

+0

Các hệ thống in trên Linux thường chuyển đổi toàn bộ tài liệu sang PostScript (nếu đó không phải là nó đã là) như một ngôn ngữ trung gian ngay cả khi làm việc với máy in dựa trên ban nhạc, vì vậy hệ thống in đang làm đệm cho bạn. –

+0

Ah, tôi nghi ngờ như vậy. Tốt để biết, cảm ơn! – ZoogieZork

2

Có một số lý do khiến việc này có thể xảy ra.

Tùy thuộc vào hệ thống in cơ bản, nó có thể muốn tính các thuộc tính nhất định "lên phía trước" (ví dụ: mở rộng trang, sử dụng mực in, v.v.) mà không phải đệm toàn bộ tài liệu.

Ngoài ra, một số hệ thống in nhất định là "dựa trên ban nhạc", chứ không phải dựa trên trang. Ví dụ, các máy in sẽ in ra một dải ngang của dữ liệu raster tại một thời điểm. Thay vì đệm dữ liệu raster của trang (khoảng 100MB cho trang thư 600dpi của Hoa Kỳ), hệ thống in Java chỉ có thể đệm một vài băng (hoặc thậm chí chỉ có một băng) tại một thời điểm.

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