【发布时间】:2011-10-25 00:06:40
【问题描述】:
我有一个带有 JScrollPane 内的自定义表格的 Swing 表单(它只是一个 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);
我的排列用完了。有谁知道(a)如何更改操作系统的最大帧大小,(b)如何布局和绘制屏幕外组件,或者(c)如何直接打印 Swing 组件,而不必绘制它(?) .感谢您的帮助。
【问题讨论】:
-
d) 为什么要打印这个? JScrollPane 通过滚动帮助您在屏幕上 看到这个大东西。您能否为自定义表格的数据定义不同的视图,使其便于打印?
-
@Mario C 在右侧我看到一些相关的帖子,也有链接/教程如何打印 2D 图形和文本 JComponents,如果我理解正确你的问题是计算纸张的 DPI 与像素(总是) 来自可见容器(JScrollPane 内容未知)
-
@mKorbel 我对不完整的信息没有任何问题 - 我可以很好地获得组件的大小。问题在于 painting - 我无法绘制任何无法显示的组件(不足为奇)。
-
@Atreys 的想法是我可以直接获取表单并打印它,而不必创建另一个对打印机友好的表单版本。在任何情况下,出于同样的原因,将 JScrollPane 的内容直接替换到面板中也不起作用。替换后,内容窗格会很大,当它在 JFrame 中可显示时会被压缩到一定大小(即使布局中没有给出任何内容)。