【问题标题】:print swt component even if hidden by scrollbar即使被滚动条隐藏也打印 swt 组件
【发布时间】:2013-11-01 10:32:53
【问题描述】:

我尝试将 swt TreeViewer 打印到 png 文件。与:

Tree tree = treeViewer.getTree();
Image image = new Image(display, tree.getSize().x, tree.getParent().getSize().y);
GC gc = new GC(image);

System.out.println(new File(pathToSave).getAbsolutePath());
tree.print(gc);

ImageLoader loader = new ImageLoader();
loader.data = new ImageData[] { image.getImageData() };
loader.save(pathToSave, SWT.IMAGE_PNG);
gc.dispose();
image.dispose();

png 只包含树的可见部分。该树有一个滚动条,因为它包含的元素多于表单的大小。

我想打印所有元素可见且不带滚动条的树。有什么想法吗?

在摆动组件上,我可以使用 .paintall().. swt 组件似乎不知道这一点。

【问题讨论】:

    标签: java printing swt components visible


    【解决方案1】:

    首先,图像的大小应该是树没有滚动时的大小,而不是当前大小。为此,您应该使用computeSize(SWT.DEFAULT, SWT.DEFAULT, true)。然后你应该调整树的大小,打印,然后重新调整大小。由于您不希望用户注意到这一点,因此在此操作期间您应该使用 setRedraw(false) 禁用绘图。

    这是一个完整的 sn-p 功能:

    public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        Composite composite = new Composite(shell, SWT.NONE);
        composite.setLayout(new FillLayout());
    
        final Tree tree = new Tree(composite, SWT.NONE);
        for (int i = 0; i < 100; i++) {
            final TreeItem treeItem = new TreeItem(tree, SWT.NONE);
            treeItem.setText(String.format("item %d long                      name", i));
        }
        tree.addListener(SWT.DefaultSelection, new Listener() {
            @Override
            public void handleEvent(Event event) {
                tree.getParent().setRedraw(false);
                final Point originalSize = tree.getSize();
                final Point size = tree.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
                final Image image = new Image(display, size.x, size.y);
                final GC gc = new GC(image);
    
                tree.setSize(size);
                tree.print(gc);
                tree.setSize(originalSize);
    
                final ImageLoader loader = new ImageLoader();
                loader.data = new ImageData[]{image.getImageData()};
                final String pathToSave = "out.png";
                System.out.println(new File(pathToSave).getAbsolutePath());
                loader.save(pathToSave, SWT.IMAGE_PNG);
                gc.dispose();
                image.dispose();
                tree.getParent().setRedraw(true);
            }
        });
    
        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
        display.dispose();
    }
    

    按回车键保存文件。

    【讨论】:

    • 如果Tree 大到甚至无法在屏幕上显示(调整大小后),这是否有效?
    • 这正是我正在寻找的。我从没想过禁用重绘。非常感谢!!!!
    • @Baz 我测试了 1000 个项目,我的显示器很大,但没那么大 :)
    • @Baz 是的,我的树是 400 x 68000 并且打印得很好
    • @andi 非常好。在这种情况下 +1 :)
    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 2013-01-16
    • 2015-02-15
    • 1970-01-01
    • 2013-12-17
    • 2013-03-01
    相关资源
    最近更新 更多