2

java.awt.print を使用して JPanel を印刷しようとしています。JPanel を印刷したいです。ボタンが 1 つしかない次のコードを試しました。印刷すると、ページの左隅に表示されますが、必要です。画面に表示される元の位置に印刷するには、境界を設定して正確な位置を指定する方法はありますか?

ここにコードを入力してください

import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
import java.awt.event.*;

public class PrintButton extends JPanel implements
        Printable, ActionListener {

    JButton ok = new JButton("OK");

    public PrintButton() {
        ok.addActionListener(this);
        this.setPreferredSize(new Dimension(400, 400));
        this.add(ok);
        JFrame frame = new JFrame("Print");
        frame.getContentPane().add(this);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new PrintButton();
    }

    public void actionPerformed(ActionEvent e) {


        PrinterJob printJob = PrinterJob.getPrinterJob();
        printJob.setPrintable(this);
        if (printJob.printDialog()) {
            try {
                printJob.print();
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
        }
    }

    public int print(Graphics g, PageFormat pf, int index) throws
            PrinterException {

        Graphics2D g2 = (Graphics2D) g;
        if (index >= 1) {
            return Printable.NO_SUCH_PAGE;
        } else {

            ok.printAll(g2);
            return Printable.PAGE_EXISTS;
        }

    }
}
4

1 に答える 1

4

あなたのprint方法では、ボタンのみを印刷しています:

ok.printAll(g2);

JPanel を印刷するには、その JPanel の printAll メソッドを呼び出す必要があります。

this.printAll(g2);

パネルが確実にページに収まるようにする場合は、PageFormat オブジェクトで渡されたページ サイズに基づいて、Graphics2D 変換を使用してパネルをスケーリングする必要があります。

AffineTransform originalTransform = g2.getTransform();

double scaleX = pf.getImageableWidth() / this.getWidth();
double scaleY = pf.getImageableHeight() / this.getHeight();
// Maintain aspect ratio
double scale = Math.min(scaleX, scaleY);
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.scale(scale, scale);
this.printAll(g2);

g2.setTransform(originalTransform);

注:私は実際にこれをテストしていません。

于 2013-09-11T15:18:11.847 に答える