Er zijn twee mogelijke opties:u kunt proberen de kolommen te verkleinen zodat ze gelijkmatig over de beschikbare paginabreedte worden verdeeld OF u kunt de resulterende uitvoer OMHOOG schalen zodat deze op de pagina past.
Schaal
Standaard is de TablePrintable
schaalt alleen OMLAAG, waardoor een JTable
. wordt geforceerd die te groot is om binnen het beschikbare paginaformaat (breedte) te passen. Je kunt dit wijzigen zodat het ook OMHOOG kan worden geschaald.
Het stukje code dat de schaal berekent, bevindt zich binnen de print
van de TablePrintable
klasse en ziet eruit als...
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;
}
Het deel waarin we geïnteresseerd zijn, is de if
statement, die luidt:"Als printmode gelijk is aan FIT_WIDTH EN de totaleColWidth is groter dan de paginabreedte"...We willen dit veranderen om alleen ""als printmode gelijk is aan FIT_WIDTH" te lezen...
Je zou kunnen veranderen
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
naar
if (printMode == JTable.PrintMode.FIT_WIDTH) {
waarmee nu de TablePrintable
om zowel de tabel OMHOOG als OMLAAG te schalen...
Wat zal resulteren in iets als...
- Bovenaan is de schermuitvoer
- Links is het huidige resultaat
- Rechts is het geschaalde resultaat
Formaat van kolommen wijzigen
Dit is wat lastiger en MOET nooit worden toegepast op een JTable
dat al op het scherm staat, omdat dit zal knoeien met hoe het daadwerkelijk wordt weergegeven...
Kortom, wanneer de tabel wordt afgedrukt, gaan we de kolombreedten overschrijven om ze gelijke ruimte over de pagina te geven...
Eerst moeten we totalColWidth
. wijzigen in TablePrintable
van...
private final int totalColWidth;
naar
private int totalColWidth;
omdat we de waarde moeten kunnen wijzigen nadat deze is geïnitialiseerd...
Vervolgens hebben we een vlag nodig om te bepalen of de kolommen zijn gewijzigd of niet, want het is zonde om telkens opnieuw de grootte te moeten bijwerken print
wordt gebeld.
Voeg private boolean updateColumnWidths;
naar de velden van TablePrintable
(bijvoorbeeld onder private final Font footerFont;
)
Nu, wanneer print
wordt genoemd, moeten we een reeks beslissingen nemen...
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;
}
//...
Dat genereert iets als...