Vous avez deux options possibles, vous pouvez essayer de redimensionner les colonnes afin qu'elles soient uniformément réparties sur la largeur de page disponible OU vous pouvez redimensionner la sortie résultante afin qu'elle s'adapte à la page.
Mise à l'échelle
Par défaut, le TablePrintable
ne fait que diminuer, forçant un JTable
qui est trop grand pour tenir dans la taille de page disponible (largeur). Vous pouvez modifier cela pour lui permettre également d'évoluer vers le haut.
Le morceau de code qui calcule l'échelle se trouve dans le print
du TablePrintable
classe et ressemble à...
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;
}
La partie qui nous intéresse est le if
déclaration, qui lit "si printmode est égal à FIT_WIDTH ET le totalColWidth est supérieur à la largeur de la page"... Nous voulons changer cela pour lire "" si printmode est égal à FIT_WIDTH" seulement...
Vous pourriez changer
if (printMode == JTable.PrintMode.FIT_WIDTH && totalColWidth > imgWidth) {
à
if (printMode == JTable.PrintMode.FIT_WIDTH) {
qui autorisera désormais le TablePrintable
pour mettre à l'échelle la table vers le HAUT et vers le BAS...
Ce qui se traduira par quelque chose comme...
- Le haut est la sortie d'écran
- La gauche est le résultat actuel
- La droite est le résultat mis à l'échelle
Redimensionner les colonnes
C'est un peu plus délicat et NE DEVRAIT jamais être appliqué à un JTable
qui est déjà à l'écran, car cela perturbera la façon dont il est réellement affiché...
En gros, lorsque le tableau est imprimé, nous allons remplacer les largeurs de colonne pour leur donner un espace égal sur la page...
Tout d'abord, nous devons changer totalColWidth
dans TablePrintable
de...
private final int totalColWidth;
à
private int totalColWidth;
car nous devons pouvoir modifier la valeur après son initialisation...
Ensuite, nous avons besoin d'un indicateur pour déterminer si les colonnes ont été modifiées ou non, car c'est une perte de devoir mettre à jour leurs tailles à chaque fois print
est appelé.
Ajouter private boolean updateColumnWidths;
aux champs de TablePrintable
(par exemple, sous private final Font footerFont;
)
Maintenant, quand print
est appelé, nous devons prendre une série de décisions...
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;
}
//...
Ce qui génère quelque chose comme...