Как я могу "упаковать ()" печатный компонент Java Swing? - PullRequest
3 голосов
/ 25 мая 2010

Я реализовал компонент Java Swing, который реализует Printable. Если я добавляю компонент в JFrame и выполняю this.pack(); в JFrame, он печатается идеально. Но если я не добавлю компонент в 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(); не работает на меня.

1 Ответ

2 голосов
/ 25 мая 2010

Вы можете использовать invalidate(), что вызовет validate() для вызова validateTree(); в качестве альтернативы используйте validateTree() напрямую.

@ TacB0sS, кажется, имеет смысл: просто не вызывайте setVisible(); этот связанный предыдущий вопрос цитируется для справки.

...