Máte dvě možné možnosti, můžete zkusit změnit velikost sloupců tak, aby byly rovnoměrně rozmístěny po celé dostupné šířce stránky, NEBO můžete výsledný výstup zvětšit tak, aby odpovídal stránce.
Škálování
Ve výchozím nastavení TablePrintable
pouze se zmenšuje a vynutí JTable
který je příliš velký a nevejde se do dostupné velikosti stránky (šířky). Toto můžete změnit, aby se také zvětšilo.
Úsek kódu, který vypočítává měřítko, je v print
z TablePrintable
třída a vypadá jako...
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;
}
Část, která nás zajímá, je if
příkaz, který zní "pokud se režim tisku rovná FIT_WIDTH A celková šířkaColWidth je větší než šířka stránky"...Chceme to změnit tak, aby znělo pouze ""pokud se režim tisku rovná FIT_WIDTH"...
Můžete změnit
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
do
if (printMode == JTable.PrintMode.FIT_WIDTH) {
což nyní umožní TablePrintable
jak změnit měřítko tabulky NAHORU a DOLŮ...
Což bude mít za následek něco jako...
- Nahoře je výstup obrazovky
- Vlevo je aktuální výsledek
- Vpravo je zmenšený výsledek
Změnit velikost sloupců
Toto je trochu složitější a NEMĚLO by se to nikdy aplikovat na JTable
který je již na obrazovce, protože to bude mít problém s tím, jak se skutečně zobrazí...
V zásadě, když je tabulka vytištěna, přepíšeme šířky sloupců, aby měly stejný prostor na stránce...
Nejprve musíme změnit totalColWidth
v TablePrintable
od...
private final int totalColWidth;
do
private int totalColWidth;
protože potřebujeme mít možnost upravit hodnotu poté, co je inicializována...
Dále potřebujeme příznak, který určí, zda byly sloupce změněny nebo ne, protože je zbytečné opakovaně aktualizovat jejich velikosti při každém print
se nazývá.
Přidejte private boolean updateColumnWidths;
do polí TablePrintable
(například v části private final Font footerFont;
)
Nyní, když print
se nazývá, musíme učinit řadu rozhodnutí...
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 něco jako...