Tôi đã tìm kiếm cao và thấp cho câu trả lời này và đã bỏ trống.Làm cách nào để in tổng số trang trong một chân trang JTextPane?
Tôi có yêu cầu in nội dung của JTextPane bằng chân trang có nội dung "Trang <n> của <m> trang". Có vẻ như không thể thực hiện chức năng đơn giản này trong Java.
Tôi có thể đặt chân trang để in số trang khi tôi nhận được Bản in, ví dụ:
String header = "whatever"; String footer = " Page - {0}"; printText(textPane.getPrintable(new MessageFormat(header), new MessageFormat(footer)));
Nhưng dường như không có cách nào để tìm tổng số trang sẽ được in cho đến khi hộp thoại máy in được gửi đi. Tôi cho rằng đó là vì hộp thoại đó được sử dụng để định dạng các trang trước khi chúng được gửi đến máy in. Hộp thoại máy in luôn nói rằng chỉ có 1 (một) trang. Vì vậy, tôi bắt đầu viết một thường trình sẽ đi qua tài liệu JTextPane và đếm các trang bằng cách lấy vùng có thể xem được từ PageFormat trong phương thức print() và sau đó sử dụng chiều cao của mỗi dòng (fontsize) để đếm các dòng trong mỗi trang và sau đó đếm số lượng trang.
int maxh = (int) pf.getImageableHeight(); Element section = doc.getDefaultRootElement(); for (int i=0; i<paraCount; i++) { Element e = section.getElement(i); // Get the attributeSet for this paragraph (Element) // The attributeSet contains the Styles, which contain // the fonts etc. AttributeSet attrs = e.getAttributes(); int fontsize = StyleConstants.getFontSize(attrs); // .... add up the lines and count filled pages ... }
Tuy nhiên, PageFormat không có sẵn cho đến khi hệ thống gọi trở lại vào phương pháp in(), và do thời gian nó được cho là phương pháp in(), nó dường như là không thể thay đổi chân từ đầu trang và chân trang đều được định nghĩa là "cuối cùng" trong cuộc gọi phương thức:
public Printable getPrintable(final MessageFormat headerFormat, final MessageFormat footerFormat)
Chắc chắn ai đó đã tìm thấy một cách đơn giản để thực hiện chức năng cơ bản này.
Cảm ơn bạn trước vì bất kỳ ai có thể trợ giúp.
+1, câu hỏi hay :-) – kleopatra
MessageFormat không phải là cuối cùng - bạn đã thử MessageFormat.applyPattern để thay đổi các thông báo sau khi chỉ định ban đầu nhưng chỉ trước khi in? Ngoài ra, các tính toán trang được thực hiện trong sun.swing.text.TextComponentPrintable.java. Chúng rất phức tạp nhưng có thể bạn có thể chạy chúng hai lần, một khi được phân lớp hoặc chuyển hướng để bỏ qua việc in thực tế nhưng nhận tổng số trang và lần thứ hai in. Chỉ cần một số ý tưởng ... – Boann
Tôi chưa thử bất kỳ ý tưởng nào. Cảm ơn bạn cho lời khuyên.Tôi không chắc chắn làm thế nào để có được đầu trang và chân trang để sửa đổi trong phương thức print(). Nếu tôi bằng cách nào đó có thể tính toán số trang trước khi tôi đến đó, nó sẽ giữ cho phương thức print() đơn giản. – Banjo