文字列に保存された長いテキストがあります。テキストを 1 ページに 2 列で印刷したいと考えています。Java Swing を使用してこれを行うにはどうすればよいですか?
改行を使用するときにテキストを折り返す方法がわかりません。Java チュートリアルのレッスン: 印刷を読みましたが、 FontMetrics
.
Java API にこれに適したメソッドはありますか、またはこれに使用できる優れたライブラリはありますか?
おそらく、java.awt.print.PrinterJobクラスを使用してプリンター・ジョブをセットアップし、java.awt.font.TextLayout()メソッドを使用してプリンターでグラフィックスをレンダリングします。
出力を2つの列に分割するには、プリンターから取得したjava.awt.print.PageFormatを分割する必要があります。
これは、ページ全体を使用した印刷例です。
文字列のラッピングは自分で管理する必要があります。印刷例のprint()メソッドを見てください。テキストをラップするために必要なJavaクラスが表示されます。
興味深い問題です。Document インターフェースを使用した洗練されたメソッドが存在する可能性があります。ただし、基本的には 2 つの JTextPanes() を並べて作成します。テキストを自動測定して 2 つに分割するのに多くの時間を費やすこともできますが、空白以外の文字の数を大まかにバランスさせる中間の段落境界を見つけようとします。テキストがすでに構造化されている場合は、ドキュメントを見ることができます
int findSplitBoundary(String x) {
int midPoint = x.length()/2;
for (int i = 0; i < Math.min(x.length()/2 - 2, 100); i++) {
if (x.startsWith(".\n", midPoint - i)) return midPoint- i;
if (x.startsWith(".\n", midPoint + i)) return midPoint- i;
}
return midPoint;
}
次に、テキストを次のようにペインに追加します。
JTextPane column1 = new JTextPane();
JTextPane column2 = new JTextPane();
split=findSplitBoundary(longText);
column1.setText(longText.substring(0, split));
column2.setText(longText.substring(split));
add(column1, BorderLayout.WEST);
add(column2, BorderLayout.EAST);
また、HTMLEditorKit を見ると運がいいかもしれませんが、HTML がテキスト分割のようなものを提供しているかどうかはわかりません。
column1.setEditorKit(new HTMLEditorKit());