Istnieją dwie możliwe opcje, możesz spróbować zmienić rozmiar kolumn, aby były równomiernie rozłożone na dostępnej szerokości strony LUB możesz przeskalować wynikowy wynik W GÓRĘ, aby pasował do strony.
Skalowanie
Domyślnie TablePrintable
tylko skaluje W DÓŁ, wymuszając JTable
jest zbyt duży, aby zmieścić się w dostępnym rozmiarze strony (szerokości). Możesz to zmienić, aby umożliwić skalowanie w GÓRĘ.
Fragment kodu, który oblicza skalę, znajduje się w print
TablePrintable
klasa i wygląda jak...
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;
}
Interesuje nas część if
instrukcja, która brzmi "jeśli printmode równa się FIT_WIDTH AND totalColWidth jest większe od szerokości strony"...Chcemy to zmienić, aby czytać tylko ""jeśli printmode równa się FIT_WIDTH"...
Możesz zmienić
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
do
if (printMode == JTable.PrintMode.FIT_WIDTH) {
co pozwoli teraz na TablePrintable
skalować zarówno tabelę W GÓRĘ, jak i W DÓŁ...
Co spowoduje coś takiego jak...
- Na górze jest wyjście ekranu
- Po lewej to aktualny wynik
- Po prawej stronie jest skalowany wynik
Zmień rozmiar kolumn
Jest to trochę bardziej skomplikowane i NIE POWINNO być stosowane do JTable
który jest już na ekranie, ponieważ spowoduje to bałagan w sposobie, w jaki jest faktycznie wyświetlany...
Zasadniczo, gdy tabela jest drukowana, nadpisujemy szerokości kolumn, aby zapewnić im równe miejsce na stronie...
Najpierw musimy zmienić totalColWidth
w TablePrintable
z...
private final int totalColWidth;
do
private int totalColWidth;
ponieważ musimy mieć możliwość modyfikacji wartości po jej zainicjowaniu...
Następnie potrzebujemy flagi, aby określić, czy kolumny zostały zmodyfikowane, czy nie, ponieważ wielokrotne aktualizowanie ich rozmiarów za każdym razem, gdy print
jest marnotrawstwem nazywa się.
Dodaj private boolean updateColumnWidths;
do pól TablePrintable
(na przykład w sekcji private final Font footerFont;
)
Teraz, kiedy print
nazywa się, musimy podjąć szereg decyzji...
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;
}
//...
Co generuje coś takiego jak...