sql >> Base de Datos >  >> RDS >> PostgreSQL

Table Print no se ajusta al tamaño de la página

Hay dos opciones posibles que tiene, puede intentar cambiar el tamaño de las columnas para que se distribuyan uniformemente en el ancho de página disponible O puede escalar la salida resultante hacia ARRIBA para que se ajuste a la página.

Escalado

Por defecto, el TablePrintable solo se escala HACIA ABAJO, forzando un JTable que es demasiado grande para caber dentro del tamaño de página disponible (ancho). Puede cambiar esto para permitir que también aumente la escala.

El fragmento de código que calcula la escala está dentro de print del TablePrintable clase y parece...

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 que nos interesa es el if declaración, que dice "si el modo de impresión es igual a FIT_WIDTH Y el totalColWidth es mayor que el ancho de la página"... Queremos cambiar esto para que diga ""si el modo de impresión es igual a FIT_WIDTH" solamente...

Podrías cambiar

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

a

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

que ahora permitirá el TablePrintable para escalar la tabla ARRIBA y ABAJO...

Lo que resultará en algo como...

  • La parte superior es la salida de pantalla
  • La izquierda es el resultado actual
  • La derecha es el resultado escalado

Cambiar el tamaño de las columnas

Esto es un poco más complicado y nunca DEBE aplicarse a un JTable eso ya está en la pantalla, ya que esto afectará la forma en que realmente se muestra...

Básicamente, cuando se imprima la tabla, vamos a anular los anchos de las columnas para darles el mismo espacio en la página...

Primero, necesitamos cambiar totalColWidth en TablePrintable de...

private final int totalColWidth;

a

private int totalColWidth;

porque necesitamos poder modificar el valor después de inicializarlo...

A continuación, necesitamos una bandera para determinar si las columnas se han modificado o no, ya que es un desperdicio tener que actualizar repetidamente sus tamaños cada vez que print se llama.

Añadir private boolean updateColumnWidths; a los campos de TablePrintable (por ejemplo, en private final Font footerFont; )

Ahora, cuando print se llama, tenemos que tomar una serie de decisiones...

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;

    }
    //...

Lo que genera algo como...