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