我在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组件而不必绘制(?) 。感谢帮助。
由于JScrollPane中的组件可以具有任意大小,即使将其设置为可显示之后,我的解决方案是尝试以下操作:
JPanel c = createPanel(); JFrame f = new JFrame(); f.getContentPane().add(new JScrollPane(c)); f.pack(); print(c);
这样我就可以验证JPanel,而不必将其大小限制为JFrame的最大大小。从直接打印组件获得的字体和内容上,它也具有“无限分辨率”外观,而无需像建议的垃圾桶那样进行双重缓冲。