sql >> データベース >  >> RDS >> PostgreSQL

表の印刷がページサイズに適合しない

    考えられるオプションは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;
    
        }
        //...
    

    これは次のようなものを生成します...




    1. MySQLでのLOCATE()関数のしくみ

    2. SELECTリストの他の場所でエイリアスを参照する

    3. 認証タイプ10がサポートされていないため、PostgresDBに接続できません

    4. 挿入コマンドを実行し、挿入されたIDをSQLに返します