Я реализовал компонент 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();
не работает на меня.