Има две възможни опции, които имате, можете да опитате да преоразмерите колоните, така че да са равномерно разпределени в наличната ширина на страницата ИЛИ можете да мащабирате получения резултат НАГОРЕ, така че да пасне на страницата.
Мащабиране
По подразбиране TablePrintable
намалява само НАДОЛУ, принуждавайки JTable
който е твърде голям, за да се побере в наличния размер на страницата (ширина). Можете да промените това, за да му позволите също да се увеличава.
Частта от кода, която изчислява мащаба, е в print
на TablePrintable
клас и изглежда като...
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;
}
Частта, която ни интересува, е if
изявление, което гласи "ако printmode е равен на FIT_WIDTH И totalColWidth е по-голям от ширината на страницата"...Искаме да променим това, за да чете само ""if printmode е равно на FIT_WIDTH"...
Можеш да промениш
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
до
if (printMode == JTable.PrintMode.FIT_WIDTH) {
което сега ще позволи на TablePrintable
както за мащабиране на таблицата НАГОРЕ и НАДОЛУ...
Което ще доведе до нещо като...
- Отгоре е изходът на екрана
- Вляво е текущият резултат
- Вдясно е мащабираният резултат
Преоразмеряване на колоните
Това е малко по-трудно и никога НЕ ТРЯБВА да се прилага към JTable
който вече е на екрана, тъй като това ще обърка начина, по който всъщност се показва...
По принцип, когато таблицата е отпечатана, ще заменим ширините на колоните, за да им дадем еднакво пространство в цялата страница...
Първо, трябва да променим totalColWidth
в TablePrintable
от...
private final int totalColWidth;
до
private int totalColWidth;
защото трябва да можем да променим стойността, след като бъде инициализирана...
След това се нуждаем от флаг, за да определим дали колоните са били модифицирани или не, тъй като е излишно да се налага многократно да актуализирате техните размери всеки път, когато print
се нарича.
Добавете private boolean updateColumnWidths;
към полетата на TablePrintable
(например под private final Font footerFont;
)
Сега, когато print
се нарича, трябва да вземем поредица от решения...
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;
}
//...
Което генерира нещо като...