当前位置: 首页 > 面试题库 >

打印大型Swing组件

段干浩荡
2023-03-14
问题内容

我在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的最大大小。从直接打印组件获得的字体和内容上,它也具有“无限分辨率”外观,而无需像建议的垃圾桶那样进行双重缓冲。



 类似资料:
  • int main() { int array[201]; int i; for (i = 0; i < 201; i++) array[i] = i; return 0; } 技巧 在gdb中,如果要打印大数组的内容,缺省最多会显示200个元素: (gdb) p array $1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,

  • 为了测试一个程序,我编写了以下语句:

  • 在我的项目中,客户需要使用POS打印机打印收据,这可以使用JAVA POS来完成。我在网上搜索没有任何有用的材料,但发现 1.javapos 2.jpos 可以有人请指导我应该进行JAVA POS或JPOS。 该应用程序基于Java Swing desktop而不是基于web。 真的坚持这一点,任何帮助都是非常有用的

  • 最大乘积子数组给定一个数组包含正整数和负整数,求最大乘积的子数组。例子: 但不能破题找到子数组。

  • 假设我必须生成20个随机坐标,20个行号和20个列号。 有没有办法显示我存储在数组中的所有数字?尝试使用偏移,但没有成功。

  • 问题内容: 我不知道如何将可变数量的变量传递给函数。我认为传入一个数组并使用数组键作为变量名可以代替将额外的变量传递给函数的需要,并且它起作用了(我敢肯定有一种更好的方法可以做到这一点,欢迎提出建议)。但是,我似乎无法从函数内部的数组中获取键。 数组: 函数内部: 函数内部的代码重新发出警告:为foreach()提供了无效的参数。如何将键从阵列中拉出? 问题答案: 您可以使用PHP的array_k