Existem duas opções possíveis, você pode tentar redimensionar as colunas para que sejam distribuídas uniformemente pela largura da página disponível OU você pode dimensionar a saída resultante para CIMA para que se ajuste à página.
Escalonamento
Por padrão, o
TablePrintable
apenas diminui, forçando um JTable
que é muito grande para caber no tamanho de página disponível (largura). Você pode alterar isso para permitir que ele também seja dimensionado para CIMA. O pedaço de código que calcula a escala está dentro do
print
do TablePrintable
classe e parece... 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;
}
A parte que nos interessa é o
if
declaração, que diz "se printmode for igual a FIT_WIDTH E totalColWidth for maior que a largura da página"...Queremos mudar isso para ler ""if printmode for igual a FIT_WIDTH" apenas... Você poderia mudar
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
para
if (printMode == JTable.PrintMode.FIT_WIDTH) {
que agora permitirá o
TablePrintable
para escalar a tabela PARA CIMA e PARA BAIXO... O que resultará em algo como...
- A parte superior é a saída da tela
- Esquerda é o resultado atual
- Direito é o resultado escalonado
Redimensionar colunas
Isso é um pouco mais complicado e nunca DEVE ser aplicado a um
JTable
que já está na tela, pois isso vai mexer com a forma como ele é realmente exibido ... Basicamente, quando a tabela é impressa, vamos substituir as larguras das colunas para dar a elas um espaço igual na página...
Primeiro, precisamos alterar
totalColWidth
em TablePrintable
a partir de... private final int totalColWidth;
para
private int totalColWidth;
porque precisamos ser capazes de modificar o valor depois de inicializado ...
Em seguida, precisamos de um sinalizador para determinar se as colunas foram modificadas ou não, pois é um desperdício ter que atualizar repetidamente seus tamanhos toda vez que
print
é chamado. Adicionar
private boolean updateColumnWidths;
aos campos de TablePrintable
(por exemplo, em private final Font footerFont;
) Agora, quando
print
é chamado, precisamos tomar uma série de decisões... 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;
}
//...
O que gera algo como...