3

を実装するJavaSwingコンポーネントを実装しPrintableました。コンポーネントをJFrameに追加し、JFrameで実行this.pack();すると、完全に印刷されます。ただし、コンポーネントをJFrameに追加しないと、空白のページだけが印刷されます。

このコードは素晴らしいプリントアウトを提供します:

final PrintablePanel p = new PrintablePanel(pageFormat);
new JFrame() {{ getContentPane().add(p); this.pack(); }};
job.setPrintable(p, pageFormat);
try {
    job.print();
} catch (PrinterException ex) {
    System.out.println("Fail");
}

しかし、このコードは空白のページを提供します:

final PrintablePanel p = new PrintablePanel(pageFormat);
// new JFrame() {{ getContentPane().add(p); this.pack(); }};
job.setPrintable(p, pageFormat);
try {
    job.print();
} catch (PrinterException ex) {
    System.out.println("Fail");
}

this.pack();それが大きな違いだと思います。pack()JFrameに追加せずに、印刷可能なコンポーネントを正常に印刷するにはどうすればよいですか?パネルはいくつかのLayoutManagerを使用しています。

試してみましたが、機能p.validate();p.revalidate();ません。助言がありますか?または、コンポーネントを印刷する前に、非表示のJFrameに追加する必要がありますか?

更新:実行すると、p.doLayout();一部のパーツは印刷されますが、サブコンポーネントは印刷されません。そしてのドキュメントからdoLayout()

このコンテナにそのコンポーネントを配置させます。ほとんどのプログラムは、このメソッドを直接呼び出すべきではありませんが、代わりにvalidateメソッドを呼び出す必要があります。

しかし、私のために働いていませp.validate();

4

1 に答える 1

2

を使用するinvalidate()と、;validate()が呼び出されます。または、直接validateTree()使用してください。validateTree()

@ TacB0sSは良い点を示しているようです:単に呼び出さないでくださいsetVisible(); この関連する前の質問は参照用に引用されています。

于 2010-05-25T15:00:27.910 に答える