Det finns två möjliga alternativ du har, du kan försöka ändra storleken på kolumnerna så att de är jämnt fördelade över den tillgängliga sidbredden ELLER så kan du skala upp resultatet UPP så att det passar sidan.
Skalning
Som standard är TablePrintable
skalar bara NER, vilket tvingar fram en JTable
som är för stor för att passa inom den tillgängliga sidstorleken (bredd). Du kan ändra detta så att det också kan skalas UPP.
Kodbiten som beräknar skalan ligger inom print
i TablePrintable
klass och ser ut som...
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 är intresserade av är if
uttalande, som lyder "om utskriftsläge är lika med FIT_WIDTH OCH totalColWidth är större än sidbredden"...Vi vill ändra detta till att endast läsa ""om utskriftsläge är lika med FIT_WIDTH"...
Du kan ändra
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
till
if (printMode == JTable.PrintMode.FIT_WIDTH) {
vilket nu tillåter TablePrintable
för att både skala tabellen UPP och NER...
Vilket kommer att resultera i något som...
- Överst är skärmutgången
- Till vänster är det aktuella resultatet
- Höger är det skalade resultatet
Ändra storlek på kolumner
Detta är lite mer knepigt och BÖR aldrig tillämpas på en JTable
som redan finns på skärmen, eftersom det kommer att störa hur det faktiskt visas...
I grund och botten, när tabellen skrivs ut, kommer vi att åsidosätta kolumnbredderna för att ge dem lika utrymme över sidan...
Först måste vi ändra totalColWidth
i TablePrintable
från...
private final int totalColWidth;
till
private int totalColWidth;
eftersom vi måste kunna ändra värdet efter att det har initierats...
Därefter behöver vi en flagga för att avgöra om kolumnerna har modifierats eller inte, eftersom det är ett slöseri att behöva uppdatera sina storlekar upprepade gånger varje gång print
kallas.
Lägg till private boolean updateColumnWidths;
till fälten i TablePrintable
(till exempel under private final Font footerFont;
)
Nu, när print
kallas, måste vi fatta en rad beslut...
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;
}
//...
Vilket genererar något som...