PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

L'impression du tableau ne correspond pas à la taille de la page

Vous avez deux options possibles, vous pouvez essayer de redimensionner les colonnes afin qu'elles soient uniformément réparties sur la largeur de page disponible OU vous pouvez redimensionner la sortie résultante afin qu'elle s'adapte à la page.

Mise à l'échelle

Par défaut, le TablePrintable ne fait que diminuer, forçant un JTable qui est trop grand pour tenir dans la taille de page disponible (largeur). Vous pouvez modifier cela pour lui permettre également d'évoluer vers le haut.

Le morceau de code qui calcule l'échelle se trouve dans le print du TablePrintable classe et ressemble à...

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 partie qui nous intéresse est le if déclaration, qui lit "si printmode est égal à FIT_WIDTH ET le totalColWidth est supérieur à la largeur de la page"... Nous voulons changer cela pour lire "" si printmode est égal à FIT_WIDTH" seulement...

Vous pourriez changer

if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {

à

if (printMode == JTable.PrintMode.FIT_WIDTH) {

qui autorisera désormais le TablePrintable pour mettre à l'échelle la table vers le HAUT et vers le BAS...

Ce qui se traduira par quelque chose comme...

  • Le haut est la sortie d'écran
  • La gauche est le résultat actuel
  • La droite est le résultat mis à l'échelle

Redimensionner les colonnes

C'est un peu plus délicat et NE DEVRAIT jamais être appliqué à un JTable qui est déjà à l'écran, car cela perturbera la façon dont il est réellement affiché...

En gros, lorsque le tableau est imprimé, nous allons remplacer les largeurs de colonne pour leur donner un espace égal sur la page...

Tout d'abord, nous devons changer totalColWidth dans TablePrintable de...

private final int totalColWidth;

à

private int totalColWidth;

car nous devons pouvoir modifier la valeur après son initialisation...

Ensuite, nous avons besoin d'un indicateur pour déterminer si les colonnes ont été modifiées ou non, car c'est une perte de devoir mettre à jour leurs tailles à chaque fois print est appelé.

Ajouter private boolean updateColumnWidths; aux champs de TablePrintable (par exemple, sous private final Font footerFont; )

Maintenant, quand print est appelé, nous devons prendre une série de décisions...

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;

    }
    //...

Ce qui génère quelque chose comme...