Ci sono due possibili opzioni che hai, puoi provare a ridimensionare le colonne in modo che siano distribuite uniformemente sulla larghezza della pagina disponibile OPPURE puoi ridimensionare l'output risultante in modo che si adatti alla pagina.
Ridimensionamento
Per impostazione predefinita, il TablePrintable
ridimensiona solo GIÙ, forzando una JTable
troppo grande per rientrare nel formato pagina disponibile (larghezza). Puoi modificarlo per consentire anche la scalabilità UP.
Il pezzo di codice che calcola la scala è all'interno della print
del TablePrintable
classe e sembra...
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;
}
La parte che ci interessa è il if
istruzione, che dice "se printmode è uguale a FIT_WIDTH E totalColWidth è maggiore della larghezza della pagina"... Vogliamo cambiarlo per leggere solo ""if printmode è uguale a FIT_WIDTH"...
Potresti cambiare
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
a
if (printMode == JTable.PrintMode.FIT_WIDTH) {
che ora consentirà il TablePrintable
per scalare la tabella sia SU che GIÙ...
Il che risulterà in qualcosa del tipo...
- In alto è l'output dello schermo
- Sinistra è il risultato corrente
- Destra è il risultato in scala
Ridimensiona colonne
Questo è un po' più complicato e non DOVREBBE mai essere applicato a una JTable
che è già sullo schermo, poiché ciò rovinerà il modo in cui viene effettivamente visualizzato...
Fondamentalmente, quando la tabella viene stampata, sovrascriveremo le larghezze delle colonne per dare loro lo stesso spazio sulla pagina...
Per prima cosa, dobbiamo cambiare totalColWidth
in TablePrintable
da...
private final int totalColWidth;
a
private int totalColWidth;
perché dobbiamo essere in grado di modificare il valore dopo che è stato inizializzato...
Successivamente, abbiamo bisogno di un flag per determinare se le colonne sono state modificate o meno, poiché è uno spreco dover aggiornare ripetutamente le loro dimensioni ogni volta che print
viene chiamato.
Aggiungi private boolean updateColumnWidths;
ai campi di TablePrintable
(ad esempio, in private final Font footerFont;
)
Ora, quando print
è chiamato, dobbiamo prendere una serie di decisioni...
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;
}
//...
Che genera qualcosa come...