PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A impressão da tabela não se ajusta ao tamanho da página


Existem duas opções possíveis, você pode tentar redimensionar as colunas para que sejam distribuídas uniformemente pela largura da página disponível OU você pode dimensionar a saída resultante para CIMA para que se ajuste à página.

Escalonamento


Por padrão, o TablePrintable apenas diminui, forçando um JTable que é muito grande para caber no tamanho de página disponível (largura). Você pode alterar isso para permitir que ele também seja dimensionado para CIMA.

O pedaço de código que calcula a escala está dentro do print do TablePrintable classe e 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;
}

A parte que nos interessa é o if declaração, que diz "se printmode for igual a FIT_WIDTH E totalColWidth for maior que a largura da página"...Queremos mudar isso para ler ""if printmode for igual a FIT_WIDTH" apenas...

Você poderia mudar
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {

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

que agora permitirá o TablePrintable para escalar a tabela PARA CIMA e PARA BAIXO...

O que resultará em algo como...


  • A parte superior é a saída da tela
  • Esquerda é o resultado atual
  • Direito é o resultado escalonado

Redimensionar colunas


Isso é um pouco mais complicado e nunca DEVE ser aplicado a um JTable que já está na tela, pois isso vai mexer com a forma como ele é realmente exibido ...

Basicamente, quando a tabela é impressa, vamos substituir as larguras das colunas para dar a elas um espaço igual na página...

Primeiro, precisamos alterar totalColWidth em TablePrintable a partir de...
private final int totalColWidth;

para
private int totalColWidth;

porque precisamos ser capazes de modificar o valor depois de inicializado ...

Em seguida, precisamos de um sinalizador para determinar se as colunas foram modificadas ou não, pois é um desperdício ter que atualizar repetidamente seus tamanhos toda vez que print é chamado.

Adicionar private boolean updateColumnWidths; aos campos de TablePrintable (por exemplo, em private final Font footerFont; )

Agora, quando print é chamado, precisamos tomar uma série de decisões...
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;

    }
    //...

O que gera algo como...