PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Tabellendruck passt nicht zur Seitengröße

Es gibt zwei Möglichkeiten, die Sie haben, Sie könnten versuchen, die Spalten so zu skalieren, dass sie gleichmäßig über die verfügbare Seitenbreite verteilt sind, ODER Sie könnten die resultierende Ausgabe nach OBEN skalieren, damit sie auf die Seite passt.

Skalierung

Standardmäßig ist die TablePrintable skaliert nur NACH UNTEN und erzwingt eine JTable das zu groß ist, um in die verfügbare Seitengröße (Breite) zu passen. Sie können dies ändern, damit es auch nach oben skaliert werden kann.

Der Codeabschnitt, der die Skalierung berechnet, befindet sich in print des TablePrintable Klasse und sieht aus wie...

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;
}

Der Teil, an dem wir interessiert sind, ist if Anweisung, die lautet "wenn der Druckmodus gleich FIT_WIDTH ist UND die Gesamtspaltenbreite größer als die Seitenbreite ist" ... Wir möchten dies so ändern, dass sie nur ""wenn der Druckmodus gleich FIT_WIDTH ist" lautet ...

Sie könnten sich ändern

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

zu

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

was nun den TablePrintable erlaubt sowohl die Tabelle NACH OBEN als auch NACH UNTEN zu skalieren...

Was zu etwas wie ...

führen wird

  • Oben ist die Bildschirmausgabe
  • Links ist das aktuelle Ergebnis
  • Rechts ist das skalierte Ergebnis

Spaltengröße ändern

Dies ist etwas kniffliger und SOLLTE niemals auf eine JTable angewendet werden das ist bereits auf dem Bildschirm, da dies die tatsächliche Anzeige durcheinander bringt ...

Wenn die Tabelle gedruckt wird, werden wir im Grunde die Spaltenbreiten überschreiben, um ihnen einen gleichmäßigen Platz auf der Seite zu geben...

Zuerst müssen wir totalColWidth ändern in TablePrintable von...

private final int totalColWidth;

zu

private int totalColWidth;

weil wir in der Lage sein müssen, den Wert zu ändern, nachdem er initialisiert wurde...

Als nächstes brauchen wir ein Flag, um festzustellen, ob die Spalten geändert wurden oder nicht, da es eine Verschwendung wäre, ihre Größe jedes Mal, wenn print wiederholt wird, aktualisieren zu müssen heißt.

Fügen Sie private boolean updateColumnWidths; hinzu zu den Feldern von TablePrintable (zum Beispiel unter private final Font footerFont; )

Jetzt beim print aufgerufen wird, müssen wir eine Reihe von Entscheidungen treffen...

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;

    }
    //...

Was so etwas wie ...

erzeugt