Der er to mulige muligheder, du kan prøve at ændre størrelsen på kolonnerne, så de er jævnt fordelt over den tilgængelige sidebredde, ELLER du kan skalere det resulterende output OP, så det passer til siden.
Skalering
Som standard er TablePrintable
skaleres kun NED, hvilket tvinger en JTable
der er for stor til at passe inden for den tilgængelige sidestørrelse (bredde). Du kan ændre dette for at tillade det også at skalere OP.
Det stykke kode, der beregner skalaen, er inden for print
af TablePrintable
klasse og ligner...
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;
}
Den del, vi er interesseret i, er if
sætning, som lyder "hvis printmode er lig med FIT_WIDTH OG totalColWidth er større end sidebredden"...Vi vil ændre dette til kun at læse ""hvis printmode er lig med FIT_WIDTH"...
Du kan ændre
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
til
if (printMode == JTable.PrintMode.FIT_WIDTH) {
som nu vil tillade TablePrintable
for både at skalere tabellen OP og NED...
Hvilket vil resultere i noget som...
- Top er skærmens output
- Til venstre er det aktuelle resultat
- Højre er det skalerede resultat
Ændre størrelse på kolonner
Dette er lidt mere tricky og BØR aldrig anvendes på en JTable
der allerede er på skærmen, da dette vil rode med hvordan det faktisk vises...
Dybest set, når tabellen er udskrevet, vil vi tilsidesætte kolonnebredderne for at give dem lige stor plads på tværs af siden...
Først skal vi ændre totalColWidth
i TablePrintable
fra...
private final int totalColWidth;
til
private int totalColWidth;
fordi vi skal være i stand til at ændre værdien efter den er initialiseret...
Dernæst har vi brug for et flag for at afgøre, om kolonnerne er blevet ændret eller ej, da det er spild at skulle opdatere deres størrelser gentagne gange, hver gang print
kaldes.
Tilføj private boolean updateColumnWidths;
til felterne i TablePrintable
(for eksempel under private final Font footerFont;
)
Nu, når print
kaldes, skal vi træffe en række beslutninger...
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;
}
//...
Hvilket genererer noget som...