Ada dua opsi yang mungkin Anda miliki, Anda dapat mencoba dan mengubah ukuran kolom sehingga didistribusikan secara merata di seluruh lebar halaman yang tersedia ATAU Anda dapat menskalakan output yang dihasilkan NAIK sehingga sesuai dengan halaman.
Penskalaan
Secara default, TablePrintable
hanya skala TURUN, memaksa JTable
yang terlalu besar untuk muat dalam ukuran halaman yang tersedia (lebar). Anda dapat mengubah ini untuk mengizinkannya juga meningkatkan.
Potongan kode yang menghitung skala ada di dalam print
dari TablePrintable
kelas dan terlihat seperti...
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;
}
Bagian yang kami minati adalah if
pernyataan, yang berbunyi "jika mode cetak sama dengan FIT_WIDTH DAN totalColWidth lebih besar dari lebar halaman"...Kami ingin mengubahnya menjadi ""jika mode cetak sama dengan FIT_WIDTH" saja...
Anda dapat mengubah
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
untuk
if (printMode == JTable.PrintMode.FIT_WIDTH) {
yang sekarang akan mengizinkan TablePrintable
untuk menskalakan tabel NAIK dan TURUN...
Yang akan menghasilkan sesuatu seperti...
- Atas adalah keluaran layar
- Kiri adalah hasil saat ini
- Benar adalah hasil skala
Ubah Ukuran Kolom
Ini sedikit lebih rumit dan HARUS tidak pernah diterapkan ke JTable
yang sudah ada di layar, karena ini akan mengacaukan tampilan sebenarnya...
Pada dasarnya, saat tabel dicetak, kita akan mengganti lebar kolom untuk memberikan ruang yang sama di seluruh halaman...
Pertama, kita perlu mengubah totalColWidth
di TablePrintable
dari...
private final int totalColWidth;
untuk
private int totalColWidth;
karena kita harus dapat mengubah nilai setelah diinisialisasi...
Selanjutnya, kita memerlukan flag untuk menentukan apakah kolom telah dimodifikasi atau tidak, karena percuma jika harus memperbarui ukurannya berulang kali setiap kali print
disebut.
Tambahkan private boolean updateColumnWidths;
ke bidang TablePrintable
(misalnya, di bawah private final Font footerFont;
)
Sekarang, ketika print
dipanggil, kita perlu membuat serangkaian keputusan...
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;
}
//...
Yang menghasilkan sesuatu seperti...