一尘不染

打印大型Swing组件

java

我在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组件而不必绘制(?)
。感谢帮助。


阅读 289

收藏
2020-09-08

共1个答案

一尘不染

由于JScrollPane中的组件可以具有任意大小,即使将其设置为可显示之后,我的解决方案是尝试以下操作:

JPanel c = createPanel();
JFrame f = new JFrame();
f.getContentPane().add(new JScrollPane(c));
f.pack();
print(c);

这样我就可以验证JPanel,而不必将其大小限制为JFrame的最大大小。从直接打印组件获得的字体和内容上,它也具有“无限分辨率”外观,而无需像建议的垃圾桶那样进行双重缓冲。

2020-09-08