PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La stampa della tabella non si adatta alle dimensioni della pagina

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...