0

scrollable にあるスイングコンポーネントで構成されるフォームを印刷しようとしていますJFrame。私はそれを行うために以下のコードを試しましたが、私が得る印刷は現在ウィンドウにあるスクロールされた領域だけです。ページ全体を印刷する必要があります。

コード:

public int print(Graphics arg0, PageFormat arg1, int arg2) throws PrinterException {
    // TODO Auto-generated method stub
    //return 0;
    if (arg2 > 0) { /* We have only one page, and 'page' is zero-based */
        return NO_SUCH_PAGE;
    }

    Graphics2D g2d = (Graphics2D)arg0;
    g2d.translate((int)arg1.getImageableX(), (int)arg1.getImageableY());  

    float pageWidth = (float)arg1.getImageableWidth();  
    float pageHeight = (float)arg1.getImageableHeight();  

    float imageHeight = (float)this.getHeight();  
    float imageWidth = (float)this.getWidth();  

    float scaleFactor = Math.min((float)pageWidth/(float)imageWidth, (float)pageHeight/(float)imageHeight);  

    int scaledWidth = (int)(((float)imageWidth)*scaleFactor);  

    int scaledHeight = (int)(((float)imageHeight)*scaleFactor);    

    BufferedImage canvas = new BufferedImage( this.getWidth(),  this.getHeight(), BufferedImage.TYPE_INT_RGB);  
    Graphics2D gg = canvas.createGraphics();  
    this.paint( gg );    
    Image img = canvas ;  

    g2d.drawImage(img, 0, 0, scaledWidth, scaledHeight, null );  

    return Printable.PAGE_EXISTS;  

}  

private void button4ActionPerformed() {
    // TODO add your code
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(this);
    boolean ok = job.printDialog();
    if (ok) {
        try {
             job.print();
        } catch (PrinterException ex) {
            System.out.println("Error printing: " + ex);
         /* The job did not successfully complete */
        }
    }
}

また、いくつかのボタンと textFields を印刷から隠す必要があります。(例: 「印刷」ボタン) 助けていただければ幸いです。

4

2 に答える 2

1

this.paint( gg );呼び出しの代わりにcomponentInTheScrollPane.paint(gg);。電話したほうがいいprintAll(gg);

于 2013-09-09T05:37:02.990 に答える
1

jScrollPane を画像に描画しようとすると、毎回失敗し、表示されているセクションのみが印刷されます。この問題を回避するには、代わりに jScrollPane のコンテンツを描画する必要があります。理想的には、jScrollPane 内に jLayer、jPanel、またはその他のコンテナーがあり、次のように画像に直接描画できます。

Form (jPanel top container)
 -> jScrollPane
     -> jLayer/jPanel/container
         -> Contents (tables, buttons etc)  

scrollPane 全体でフォーム全体を印刷する方法についてのコードは提供しませんが、これには数学ともう少しコードが必要ですが、ここで開始するために、jLayer の内容をバッファリングされた画像に描画するメソッドの例を示します。 jScrollPane で表示されていない場合は、その画像をファイルに保存します (別の問題である印刷については説明しません)。

private void button4ActionPerformed() {
    try
    {
        //get height/width from the jLayeredPane or jPanel inside the scroll pane
        int imageHeight = jLayeredPane.getHeight();
        int imageWidth = jLayeredPane.getWidth();

        //Draw contents of the jLayeredPane or jPanel inside the scroll pane (but not the scroll pane itself)
        BufferedImage image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB);  
        Graphics2D gg = image.createGraphics();  
        jLayeredPane.paint(gg);

        //The "image" now has jLayers contents
        //Insert your code here to scale and print the image here
        //Some Code
        //In my example I have chosen to save the image to file with no scaling
        ImageIO.write(canvas, "png", new File("C:\\out.png"));
        //Some Code

        System.out.println("Done");
    }
    catch (IOException ex)
    {
        Logger.getLogger(GUI.class.getName()).log(Level.SEVERE, null, ex);
    }
}
于 2013-09-16T01:48:15.790 に答える