Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Использование Других Функций Swing
Как Напечатать текст
Домашняя страница > Создание GUI С JFC/Swing > Использование Других Функций Swing

Как Напечатать текст

JTextComponent class оказывает поддержку для того, чтобы напечатать текстовые документы. JTextComponent API включает методы, которые позволяют Вам реализовывать и основные и усовершенствованные задачи печати. Поддерживаемые форматы включают HTML, RTF, и простой текст. Для общих задач печати, таких как простая печать текстового документа, используйте print метод непосредственно. print у метода есть несколько форм с различными наборами параметра. Этот метод готовит Ваш текстовый документ, получает соответствие Printable объект, и отправляет это принтеру.

Если реализация по умолчанию Printable объект не удовлетворяет Ваши потребности, можно настроить расположение печати, переопределяя getPrintable метод, чтобы обернуть значение по умолчанию Printable или даже замените это в целом.

Самый легкий способ напечатать Ваш текстовый компонент состоит в том, чтобы вызвать print метод без параметров. См. пример кода ниже.

try {
    boolean complete = textComponent.print();
    if (complete) {
        /* show a success message  */
        ...
    } else {
        /*show a message indicating that printing was cancelled */
        ...
    }
} catch (PrinterException pe) {
    /* Printing failed, report to the user */
    ...
}

Когда Вы вызываете print метод без параметров, диалоговое окно печати выводится на экран, и затем Ваш текстовый компонент печатается в интерактивном режиме без заголовка или нижнего колонтитула. Пример кода ниже показывает print сигнатура метода с полным набором параметров.

boolean complete = textComponent.print(MessageFormat headerFormat,
                                       MessageFormat footerFormat, 
                                       boolean showPrintDialog,
                                       PrintService service
                                       PrintRequestAttributeSet attributes,
                                       boolean interactive);

Когда Вы вызываете print метод со всеми параметрами, Вы явно выбираете функции печати, такие как заголовок и текст нижнего колонтитула, печатая атрибуты, целевую службу печати, и также показать ли диалоговое окно печати или нет, и напечатать ли в интерактивном режиме или нев интерактивном режиме. Чтобы решить, какие параметры удовлетворяют Вашим потребностям лучше всего, см. описание доступных функций ниже.

JTextComponent печать API обеспечивает следующие функции:

Печать В интерактивном режиме или Нев интерактивном режиме

В интерактивном режиме диалоговое окно продвижения с опцией аварийного прекращения работы показывают для продолжительности печати. Вот выборка диалогового окна продвижения.

Снимок экрана печати прогрессирует диалоговое окно

Это диалоговое окно позволяет пользователю отслеживать печать продвижения. Диалоговое окно продвижения модально когда print к методу обращаются, событие диспетчеризирует поток и немодальный иначе. Важно, чтобы Ваш документ остался неизменным, будучи напечатанным, иначе поведение печати неопределено. print метод гарантирует, что Ваш документ не будет изменен и отключает компонент для продолжительности печати.

Если Вы вызываете print метод на событии диспетчеризирует поток в неинтерактивном режиме, тогда все события включая перекрашивания будут блокированы. Именно поэтому печать нев интерактивном режиме на EDT только рекомендуется для приложений с невидимым GUI.

Диалоговое окно печати

Можно вывести на экран стандартное диалоговое окно печати, которое позволяет пользователю делать следующее:

Снимок экрана диалогового окна печати

Можно заметить, что диалоговое окно печати не определяет общее количество страниц в распечатке. Это - то, потому что текст, печатающий реализацию, использует Printable API и общее количество страниц не известны прежде, чем напечатать время.

Добавление Заголовка или Нижнего колонтитула (или Оба) к Расположению Печати

Заголовками и нижними колонтитулами обеспечивают MessageFormat параметры. Эти параметры позволяют заголовку и нижнему колонтитулу быть локализованным. Считайте документацию для MessageFormat class как символы, такие как одинарные кавычки является особенным и должен избежаться. И заголовки и нижние колонтитулы центрируются. Можно вставить номер страницы при использовании {0}.

MessageFormat footer = new MessageFormat("Page - {0}");

Так как общее количество страниц в выводе не известно прежде, чем напечатать время, нет никакого способа определить формат нумерации как "Страница 1 5".

Автоматическое Расположение и Разбиение на страницы

С использованием JTextComponent печать API Вы не должны заботиться о расположении и разбиении на страницы. И расположение и разбиение на страницы делаются автоматически. Контент документа форматируется, чтобы соответствовать размеру страницы и распространениям через многократные страницы. Вы только должны определить соответствующий текстовый формат нижнего колонтитула к print метод, если Вы хотите вставить номер страницы в нижний колонтитул. Как демонстрирующийся ранее, можно определить номер страницы в своем нижнем колонтитуле включением "{0}" в строке, данной MessageFormat параметр нижнего колонтитула. В печатном выводе, {0} будет заменен текущим номером страницы.

Пример Печати Текстовой области

Давайте смотреть на вызванный пример TextAreaPrintingDemo. Основная функция этого демонстрационного примера печатает текстовый документ или на событии, диспетчеризируют поток или на фоновом потоке в зависимости от выбора пользователя. Этот демонстрационный пример выводит на экран текстовую область, позволяет выбирать несколько функций печати, и печатает контент текстовой области согласно выбранным опциям. Весь код для этой программы может быть найден в TextAreaPrintingDemo.java. Богатый GUI этого демонстрационного примера создается в разработчике GUI IDE NetBeans. Вот изображение TextAreaPrintingDemo приложение.

Снимок экрана TextAreaPrintingDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, TextAreaPrintingDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает Приложение TextAreaPrintingDemo
  2. Отредактируйте текст во флажках Header или Footer или обоих, чтобы обеспечить различный заголовок или нижний колонтитул.
  3. Снимите флажок Show Progress Dialog, если Вы хотите напечатать, не выводя на экран диалоговое окно продвижения, что означает печатать нев интерактивном режиме. Отметьте, что Вы не будете в состоянии отменить печать, как только она была запущена.
  4. Снимите флажок Print in Background, чтобы выбрать печать на событии, диспетчеризируют поток. Отметьте, что печать на EDT нев интерактивном режиме подаст Вашу безразличную заявку — взаимодействие с Вашим приложением будет блокировано для продолжительности процесса печати.
  5. Нажмите кнопку Print, чтобы напечатать контент текстовой области согласно выбранным опциям.

Всякий раз, когда запущенное сетью приложение пытается напечатать, Сеть Java Запускаются, открывает диалоговое окно безопасности то, чтобы просить, чтобы пользователь для разрешения напечатал, если это разрешение уже не предоставили в параметрах настройки системы. Продолжиться с печатью пользователя должно принять запрос.

Слушатель действия регистрируется для кнопки Print. Поскольку пользователь нажимает кнопку Print actionPerformed вызовы метода print метод, который инициирует задачу печати. Задачей печати является a SwingWorker объект. Пример кода ниже шоу, как PrintingTask class реализуется.

private class PrintingTask extends SwingWorker<Object, Object> {
    private final MessageFormat headerFormat;
    private final MessageFormat footerFormat;
    private final boolean interactive;
    private volatile boolean complete = false;
    private volatile String message;
        
    public PrintingTask(MessageFormat header, MessageFormat footer,
                        boolean interactive) {
        this.headerFormat = header;
        this.footerFormat = footer;
        this.interactive = interactive;
    }
        
    @Override
    protected Object doInBackground() {
        try {
            complete = text.print(headerFormat, footerFormat,
                    true, null, null, interactive);
            message = "Printing " + (complete ? "complete" : "canceled");
        } catch (PrinterException ex) {
            message = "Sorry, a printer error occurred";
        } catch (SecurityException ex) {
            message =
                "Sorry, cannot access the printer due to security reasons";
        }
        return null;
    }
        
    @Override
    protected void done() {
        message(!complete, message);
    }
}

Пример кода ниже шоу, как print метод получает набор выбранных опций от компонентов GUI, затем создает экземпляр PrintingTask class, и выполняет печать.

private void print(java.awt.event.ActionEvent evt) {
        MessageFormat header = createFormat(headerField);
        MessageFormat footer = createFormat(footerField);
        boolean interactive = interactiveCheck.isSelected();
        boolean background = backgroundCheck.isSelected();

        PrintingTask task = new PrintingTask(header, footer, interactive);
        if (background) {
            task.execute();
        } else {
            task.run()
        }
    }

Код полужирным иллюстрирует как PrintingTask's методы вызываются в зависимости от background значение параметра. Всякий раз, когда пользователь предпочитает печатать на фоновом потоке, execute метод вызывают, который планирует задачу печати для выполнения на фоновом потоке. Иначе run метод выполняет задачу печати на EDT.

Начиная с печати больших документов отнимающая много времени задача, рекомендуется выполнить печать на фоновом потоке.

Текстовый Пример Пакетной печати

TextBatchPrintingDemo пример иллюстрирует печатающие невидимые текстовые документы HTML о фоновых потоках. Когда запущено, этот демонстрационный пример выводит на экран страницу со списком URL. Можно посетить страницу HTML, добавить выведенную на экран страницу к списку печати, и как только Вы выбираете все страницы, в которых Вы нуждаетесь, можно напечатать их внезапно на фоновых потоках. Весь код для этой программы может быть найден в TextBatchPrintingDemo.java. Вот изображение TextBatchPrintingDemo приложение.

Снимок экрана TextBatchPrintingDemo

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, TextBatchPrintingDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Альтернативно, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.Запускает Приложение TextBatchPrintingDemo
  2. Щелкните по любой ссылке, чтобы просмотреть соответствующую страницу HTML.
  3. Нажмите ALT+A или выберите, Файл> Добавляют пункт меню Пейджа, чтобы добавить выведенную на экран страницу к списку печати, показанному справа.
  4. Нажмите ALT+H или выберите Файл> пункт меню Home Page, чтобы возвратиться к домашней странице демонстрационного примера.
  5. Добавьте так много страниц к списку печати, как Вы нуждаетесь.
  6. Нажмите ALT+C или выберите Файл> пункт меню Clear Selected, если Вы должны очистить список печати и создать в снова.
  7. Нажмите ALT+P или выберите Файл> пункт меню Print Selected, чтобы напечатать выбранные страницы.
  8. Нажмите ALT+Q или выберите Файл> пункт меню Quit, чтобы выйти из приложения.

Можно найти код печати в printSelectedPages метод. Когда вызвано, этот метод сначала получает количество страниц, выбранных для того, чтобы напечатать. Пример кода ниже шоу, как printSelectedPages метод создает a Runnable объект для каждой страницы и затем печатает текущую страницу на отдельном потоке.

for (int i = 0; i < n; i++) {
    final PageItem item = (PageItem) pages.getElementAt(i);
    // This method is called from EDT.  Printing is a time-consuming
    // task, so it should be done outside EDT, in a separate thread.
    Runnable printTask = new Runnable() {
        public void run() {
            try {
                item.print(
                        // Two "false" args mean "no print dialog" and
                        // "non-interactive" (ie, batch-mode printing).
                                null, null, false, printService, null, false);
            } catch (PrinterException pe) {
                JOptionPane.showMessageDialog(null,
                        "Error printing " + item.getPage() + "\n" + pe,
                        "Print Error", JOptionPane.WARNING_MESSAGE);
            }
        }
    };
    new Thread(printTask).start();

Текст, Печатающий API

Этот раздел перечисляет методы, определенные в JTextComponent class, которые позволяют Вам печатать текстовые документы.

Метод Цель
булева печать ()
булева печать (MessageFormat, MessageFormat)
булева печать (MessageFormat, MessageFormat, булев, PrintRequestAttributeSet, булев, PrintService)
Когда вызвано без параметров, выводит на экран диалоговое окно печати, и затем печатает этот текстовый компонент в интерактивном режиме без заголовка или текста нижнего колонтитула. Возвраты true если пользователь продолжал печатать и false если пользователь отменял печать.
Когда вызвано с двумя MessageFormat параметры, выводит на экран диалоговое окно печати, и затем печатает этот текстовый компонент в интерактивном режиме с указанным заголовком и текстом нижнего колонтитула.
Когда вызвано с полным комплектом параметров, печатает этот текстовый компонент согласно указанным параметрам. Два MessageFormat параметры определяют текст нижнего колонтитула и заголовок. Первый булев параметр определяет, показать ли диалоговое окно печати или нет. Другой булев параметр определяет, напечатать ли в интерактивном режиме или нет. С двумя другими параметрами можно определить атрибуты печати и службу печати.
Всякий раз, когда a PrintService параметр опускается, принтер значения по умолчанию будет использоваться.
Печатаемый getPrintable (MessageFormat, MessageFormat) Возвраты a Printable объект для того, чтобы напечатать Ваш текстовый компонент. Переопределите этот метод, чтобы получить специализированный Печатаемый объект. Можно обернуть один Печатаемый объект в другого, чтобы получить сложные отчеты и документы.

Примеры Та текстовая Печать Использования

Эта таблица приводит примеры, которые используют текстовую печать и точки туда, где те примеры описываются.

Пример Где Описано Примечания
TextAreaPrintingDemo Эта страница Демонстрирует основы текстовой печати и обеспечивает богатый GUI. Позволяет пользователю определять заголовок или текст нижнего колонтитула, включать или выключать диалоговое окно печати, выбирать печать в интерактивном режиме или нев интерактивном режиме, и затем печатать согласно выбранным опциям.
TextBatchPrintingDemo Эта страница Этот демонстрационный пример выводит на экран текстовый компонент со списком URL, позволяет пользователю просматривать страницы HTML, добавьте их к списку печати, и напечатайте все выбранные страницы сразу на фоновых потоках.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Напечатать Таблицы
Следующая страница: Как Создать Экран-заставку