Java 打印swt组件,即使被滚动条隐藏

Java 打印swt组件,即使被滚动条隐藏,java,printing,swt,components,visible,Java,Printing,Swt,Components,Visible,我尝试将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); Ima

我尝试将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仅包含树的可见部分。树有一个滚动条,因为它包含的元素比表单上的元素多

我想打印的树与所有元素可见,没有滚动条。有什么想法吗


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

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

下面是一个完整的代码片段,可以实现所有这些功能:

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();
}
publicstaticvoidmain(字符串[]args){
最终显示=新显示();
最终外壳=新外壳(显示);
setLayout(新的FillLayout());
复合材料=新复合材料(壳体,SWT.无);
setLayout(新的FillLayout());
最终树=新树(复合,SWT.NONE);
对于(int i=0;i<100;i++){
final TreeItem TreeItem=新TreeItem(tree,SWT.NONE);
treeItem.setText(String.format(“项%d长名称”,i));
}
addListener(SWT.DefaultSelection,new Listener()){
@凌驾
公共无效handleEvent(事件){
tree.getParent().setRedraw(false);
final Point originalSize=tree.getSize();
最终点大小=tree.computeSize(SWT.DEFAULT,SWT.DEFAULT,true);
最终图像=新图像(显示,大小.x,大小.y);
最终GC=新GC(图像);
树。设置大小(大小);
树形打印(gc);
树。设置大小(原始大小);
最终图像加载器=新图像加载器();
loader.data=newImageData[]{image.getImageData()};
最终字符串pathToSave=“out.png”;
System.out.println(新文件(pathToSave.getAbsolutePath());
保存(路径保存,SWT.IMAGE\u PNG);
gc.dispose();
image.dispose();
tree.getParent().setRedraw(true);
}
});
shell.open();
而(!shell.isDisposed()){
如果(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}

按enter键保存文件。

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

下面是一个完整的代码片段,可以实现所有这些功能:

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();
}
publicstaticvoidmain(字符串[]args){
最终显示=新显示();
最终外壳=新外壳(显示);
setLayout(新的FillLayout());
复合材料=新复合材料(壳体,SWT.无);
setLayout(新的FillLayout());
最终树=新树(复合,SWT.NONE);
对于(int i=0;i<100;i++){
final TreeItem TreeItem=新TreeItem(tree,SWT.NONE);
treeItem.setText(String.format(“项%d长名称”,i));
}
addListener(SWT.DefaultSelection,new Listener()){
@凌驾
公共无效handleEvent(事件){
tree.getParent().setRedraw(false);
final Point originalSize=tree.getSize();
最终点大小=tree.computeSize(SWT.DEFAULT,SWT.DEFAULT,true);
最终图像=新图像(显示,大小.x,大小.y);
最终GC=新GC(图像);
树。设置大小(大小);
树形打印(gc);
树。设置大小(原始大小);
最终图像加载器=新图像加载器();
loader.data=newImageData[]{image.getImageData()};
最终字符串pathToSave=“out.png”;
System.out.println(新文件(pathToSave.getAbsolutePath());
保存(路径保存,SWT.IMAGE\u PNG);
gc.dispose();
image.dispose();
tree.getParent().setRedraw(true);
}
});
shell.open();
而(!shell.isDisposed()){
如果(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}

按enter键保存文件。

如果
树太大,甚至无法在屏幕上显示(调整大小后)?这正是我要搜索的内容。我从没想过要禁用重画。非常感谢@Baz我测试了1000个项目,我的显示器很大,但没有那么大:)@Baz是的,我的树是400 x 68000,并且是打印的nicely@andi好极了+1在本例中:)如果
树太大,甚至无法在屏幕上显示(调整大小后),这是否有效?这正是我搜索的内容。我从没想过要禁用重画。非常感谢@Baz我测试了1000个项目,我的显示器很大,但没有那么大:)@Baz是的,我的树是400 x 68000,并且是打印的nicely@andi好极了+1在本例中:)