考えられるオプションは2つあります。利用可能なページ幅全体に均等に分散されるように列のサイズを変更するか、ページに収まるように結果の出力を拡大することができます。
スケーリング
デフォルトでは、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がページ幅よりも大きい場合」というステートメント...これを「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;
}
//...
これは次のようなものを生成します...