Как я могу напечатать текст в два столбца, используя Java Swing? - PullRequest
0 голосов
/ 17 мая 2010

У меня есть более длинный текст, сохраненный в строке. Я хотел бы напечатать текст в двух столбцах на одной странице. Как я могу сделать это с помощью Java Swing?

Я не понимаю, как я могу обернуть текст, когда пришло время использовать новую строку. Я прочитал Урок: печать в руководстве по Java, но я не нашел никаких полезных методов для работы с текстом или строками, кроме FontMetrics.

Есть ли в Java API хорошие методы для этого или есть какая-нибудь хорошая библиотека, которую я могу использовать для этого?

Ответы [ 2 ]

1 голос
/ 18 мая 2010

Вероятно, вы будете использовать класс java.awt.print.PrinterJob для настройки задания принтера и визуализации графики на принтере с помощью метода java.awt.font.TextLayout ().

Вам придется разделить java.awt.print.PageFormat, который вы получаете от принтера, чтобы разделить вывод на две колонки.

Вот пример печати с использованием всей страницы.

Вы должны сами управлять String-упаковкой. Посмотрите на метод print () в примере печати. Вы увидите, какие классы Java вам нужны для переноса текста.

0 голосов
/ 17 мая 2010

Интересная проблема, может быть какой-то изощренный метод, использующий интерфейс Document; но в основном создайте два бок о бок 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());
...