У меня есть форма Swing с пользовательской таблицей внутри JScrollPane (это просто JPanel, а не подкласс JTable), и я пытаюсь заставить ее напечатать.Если я просто отправляю весь кадр на принтер, панель прокрутки обрезается, и если я изменяю размер рамки до размера содержимого панели прокрутки, какой-то внутренний барьер останавливает JFrame, становящийся более чем около 1100 пикселей.
Другой альтернативой может быть создание области содержимого диалогового окна без привязки ее к корневому JFrame, поскольку размер JPanel в этом случае не ограничен.Но для того, чтобы компоненты расположились и изменили размеры до нужных размеров, мне кажется, нужно сделать панель отображаемой, что означает, по крайней мере, добавление ее в JFrame и вызов JFrame.pack (), но опять же, 1100возвращается ограничение в пикселях.
Вот мой код для печати компонента:
public static void print(final Component comp) {
final float SCALE = .5f;
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(new Printable() {
public int print(Graphics g, PageFormat pf, int page)
throws PrinterException
{
if (page * pf.getImageableHeight() >= SCALE * comp.getHeight())
return NO_SUCH_PAGE;
((Graphics2D)g).translate(pf.getImageableX(), pf.getImageableY()
- page * pf.getImageableHeight());
((Graphics2D)g).scale(SCALE, SCALE);
comp.printAll(g);
return PAGE_EXISTS;
}
});
if (job.printDialog())
try { job.print(); }
catch (PrinterException ex) {}
}
Если я сделаю это, компонент будет иметь нулевой размер:
JPanel c = createPanel(); // This JPanel has a JScrollPane in it with its
// preferredSize equal to that of its viewport component
// (which is not what I do to show the dialog normally)
print(c);
Если яСделайте это, компонент имеет правильный размер, но печатает как сплошной серый, потому что подкомпоненты не были размечены:
JPanel c = createPanel();
c.setSize(c.getPeferredSize());
print(c);
Кажется, что это не имеет значения:
JPanel c = createPanel();
c.validate();
c.revalidate();
c.repaint();
print(c);
Это делает панель больше, но она останавливается примерно на полторы страницы (1100 пикселей):
JPanel c = createPanel();
JFrame f = new JFrame();
f.setContentPane(c);
f.pack();
print(c);
У меня заканчиваются перестановки здесь.Кто-нибудь знает: (а) как изменить максимальный размер кадра ОС, (б) как расположить и нарисовать внеэкранный компонент, или (в) как напечатать компонент Swing напрямую, без необходимости его рисовать (?),Помощь приветствуется.