如何使用Java Swing在两列中打印文本?

时间:2010-05-17 14:52:04

标签: java swing text printing java-2d

我在String中保存了更长的文本。我想在一个页面上的两列中打印文本。我怎么能用Java Swing做到这一点?

我不明白在使用新行时如何包装文本。我在Java教程中阅读了Lesson: Printing,但除了FontMetrics之外,我还没有找到任何有用的方法来处理文本或字符串。

Java API中是否有任何好的方法,或者我可以使用哪个好的库?

2 个答案:

答案 0 :(得分:1)

您可能会使用java.awt.print.PrinterJob类来设置打印机作业,并使用java.awt.font.TextLayout()方法在打印机上渲染图形。

你必须将从打印机获得的java.awt.print.PageFormat分开,将输出分成两列。

这是使用整个页面的print example

你必须自己管理字符串包装。查看print示例中的print()方法。您将看到包装文本所需的Java类。

答案 1 :(得分:0)

有趣的问题,可能有一些使用Document接口的sophiticated方法;但基本上创建了两个并排的JTextPanes()。您可能会花费大量时间尝试自动测量文本,因此它会分成两部分,但我会尝试在中间找到一个段落边界,大致平衡非空白字符的数量。如果文本已经结构化,您可以查看文档

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());