我有一个带有自定义表格的Swing表单在JScrollPane中(它只是一个JPanel,而不是JTable子类),我正在尝试将其打印出来。如果我只是将整个框架发送到打印机,滚动窗格会被截断,如果我将框架调整为滚动窗格内容的大小,某种内部障碍会阻止JFrame变得超过约1100像素高。
如果我这样做,组件将具有零大小:
如果我这样做,组件的大小就是正确的,但由于子组件未被布局,因此打印出来会是纯灰色。
这会使面板变得更大,但它会在大约一页半大小(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);
我的排列组合已经用尽了。有没有人知道以下内容中的任意一项:(a)如何更改操作系统的最大帧大小,(b)如何布局和绘制屏幕外组件,或(c)如何直接打印一个Swing组件,而不必绘制它?感谢您的帮助。