Có hai tùy chọn khả thi mà bạn có, bạn có thể thử và thay đổi kích thước các cột để được phân bổ đồng đều trên chiều rộng trang có sẵn HOẶC bạn có thể chia tỷ lệ đầu ra kết quả LÊN để nó phù hợp với trang.
Chia tỷ lệ
Theo mặc định, TablePrintable
chỉ quy mô DOWN, buộc JTable
quá lớn để vừa với kích thước trang có sẵn (chiều rộng). Bạn có thể thay đổi điều này để cho phép nó cũng mở rộng quy mô.
Đoạn mã tính toán tỷ lệ nằm trong print
của TablePrintable
lớp và trông giống như ...
double sf = 1.0D;
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
// if not, we would have thrown an acception previously
assert imgWidth > 0;
// it must be, according to the if-condition, since imgWidth > 0
assert totalColWidth > 1;
sf = (double) imgWidth / (double) totalColWidth;
}
Phần chúng tôi quan tâm là if
câu lệnh có nội dung "nếu printmode bằng FIT_WIDTH VÀ totalColWidth lớn hơn chiều rộng trang" ... Chúng tôi muốn thay đổi điều này thành chỉ đọc "" nếu printmode bằng FIT_WIDTH "...
Bạn có thể thay đổi
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
đến
if (printMode == JTable.PrintMode.FIT_WIDTH) {
hiện sẽ cho phép TablePrintable
để chia tỷ lệ bảng LÊN và XUỐNG ...
Điều này sẽ dẫn đến một cái gì đó giống như ...
- Trên cùng là đầu ra màn hình
- Còn lại là kết quả hiện tại
- Đúng là kết quả được chia tỷ lệ
Thay đổi kích thước các cột
Điều này phức tạp hơn một chút và KHÔNG NÊN áp dụng cho JTable
đã có trên màn hình, vì điều này sẽ làm rối loạn cách nó thực sự được hiển thị ...
Về cơ bản, khi bảng được in, chúng tôi sẽ ghi đè chiều rộng cột để cung cấp cho chúng không gian bằng nhau trên trang ...
Đầu tiên, chúng ta cần thay đổi totalColWidth
trong TablePrintable
từ ...
private final int totalColWidth;
đến
private int totalColWidth;
bởi vì chúng tôi cần có thể sửa đổi giá trị sau khi nó được khởi tạo ...
Tiếp theo, chúng ta cần một cờ để xác định xem các cột đã được sửa đổi hay chưa, vì thật lãng phí khi phải cập nhật lại kích thước của chúng mỗi lần print
được gọi là.
Thêm private boolean updateColumnWidths;
đến các trường của TablePrintable
(ví dụ:trong private final Font footerFont;
)
Bây giờ, khi print
được gọi, chúng tôi cần đưa ra một loạt quyết định ...
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
// for easy access to these values
final int imgWidth = (int) pageFormat.getImageableWidth();
final int imgHeight = (int) pageFormat.getImageableHeight();
if (imgWidth <= 0) {
throw new PrinterException("Width of printable area is too small.");
}
// Have we modified the column widths yet??
if (!updateColumnWidths) {
// Only update the column widths if the current total column width
// is less then the available imgWidth (page width)
if (totalColWidth < imgWidth) {
// Calculate the required column width to allow the columns to
// span the page...
int columnCount = table.getColumnCount();
int columnWidth = (int) (imgWidth / (float) columnCount);
TableColumnModel columnModel = table.getColumnModel();
// Update the columns...
for (int col = 0; col < columnModel.getColumnCount(); col++) {
TableColumn tc = columnModel.getColumn(col);
tc.setMinWidth(columnWidth);
tc.setMaxWidth(columnWidth);
tc.setPreferredWidth(columnWidth);
tc.setWidth(columnWidth);
}
// Update the totalColWidth, this should prevent
// any scaling been applied
totalColWidth = columnModel.getTotalColumnWidth();
}
updateColumnWidths = true;
}
//...
Điều này tạo ra một cái gì đó giống như ...