首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWT如何打印scrolledComposite的内容?

SWT如何打印scrolledComposite的内容?
EN

Stack Overflow用户
提问于 2012-06-05 03:04:38
回答 2查看 2.1K关注 0票数 2

有人知道我会如何打印滚动合成的内容吗?

当我打印到GC上时,它只会复制滚动合成的当前可见区域。我想要的是能够复制滚动合成的全部内容。

例如,下面的代码在一个小窗口内创建了一个巨大的按钮。当我打印下面的gc时,它只输出滚动合成的一小部分可见区域。可以打印滚动合成中的所有内容吗?

代码语言:javascript
复制
Shell shell = new Shell(getDisplay());
shell.setLayout(new FillLayout());
shell.setSize(200, 200);
shell.setLocation(20, 20);


ScrolledComposite sc = new ScrolledComposite(shell, SWT.H_SCROLL| SWT.V_SCROLL);
sc.setMinSize(availWidth, availHeight + 30);

Button b = new Button(sc, SWT.PUSH);
b.setText("Button");
b.setSize(availWidth, availHeight);
sc.setContent(b);

Image image = new Image(getDisplay(), availWidth, availHeight);
GC imageGC = new GC(image);
sc.print(imageGC);
EN

回答 2

Stack Overflow用户

发布于 2012-06-05 17:52:05

Note >>>

请参阅下面的@CryptDemon注释。虽然已知该解决方案适用于Windows7和eclipse 3.7.x版本。

是的,这是可能的。您面临的问题是由于Windows paint事件的生成方式造成的(我假设是Windows操作系统,因为我只有Windows操作系统!)用于滚动窗口

在任何给定的时刻(根据您的代码),您的scrolled composite的可见大小是小于实际大小的。现在,当您在scrolled composite上调用print()时,只会打印其中的一部分(此时是可用的/可见的)。如下所示:

解决方案将在您的scrolled composite中创建一个固定的Composite,并对其调用print。

Code:

代码语言:javascript
复制
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Scrolled 
{
    public static void main(String[] args)
    {
        final Display display = new Display();

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        shell.setSize(200, 200);
        shell.setLocation(20, 20);

        final ScrolledComposite sc = new ScrolledComposite(shell, SWT.BORDER  | SWT.V_SCROLL | SWT.H_SCROLL);
        sc.setLayout(new GridLayout(1,true));

        final Composite innerComposite = new Composite(sc, SWT.NONE);
        innerComposite.setSize(400, 400);
        innerComposite.setLayout(new GridLayout(1, true));

        for(int i = 0; i < 10; i++)
        {
                Button b = new Button(innerComposite, SWT.PUSH);
                b.setText("Text");
                b.addSelectionListener(new SelectionAdapter() {
                    public void widgetSelected(SelectionEvent e) 
                    {
                        Image image = new Image(display, innerComposite.getBounds().width, innerComposite.getBounds().height);
                        ImageLoader loader = new ImageLoader();

                        GC gc = new GC(image);
                        sc.print(gc);
                        gc.dispose();

                        loader.data = new ImageData[]{image.getImageData()};
                        loader.save("c:/temp/out.png", SWT.IMAGE_PNG);
                    }
                });
        }

        sc.setMinSize(innerComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        sc.setContent(innerComposite);
        sc.setExpandHorizontal(true);
        sc.setExpandVertical(true);


        shell.open();
        while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                        display.sleep();
        }
        display.dispose();
    }
}

Output:

票数 2
EN

Stack Overflow用户

发布于 2016-07-29 10:24:19

SWT(GTK3似乎修复了这个错误),但是在我们的项目中,我们打算继续使用SWT(GTK2),我们的解决方案是创建一个temp shell并将控件重设为temp shell的父对象

代码语言:javascript
复制
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.ImageLoader;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Scrolled {
    public static void main(String[] args) {
        final Display display = new Display();

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        shell.setSize(200, 200);
        shell.setLocation(20, 20);

        final ScrolledComposite sc = new ScrolledComposite(shell, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        sc.setLayout(new GridLayout(1, true));

        final Composite innerComposite = new Composite(sc, SWT.NONE);
        innerComposite.setSize(400, 400);
        innerComposite.setLayout(new GridLayout(1, true));

        for (int i = 0; i < 10; i++) {
            Button b = new Button(innerComposite, SWT.PUSH);
            b.setText("Text");
            b.addSelectionListener(new SelectionAdapter() {
                public void widgetSelected(SelectionEvent e) {
                    Image image = new Image(display, innerComposite.getBounds().width,
                            innerComposite.getBounds().height);
                    ImageLoader loader = new ImageLoader();

                    GC gc = new GC(image);

                    // Create a temp shell and reparent it+
                    Shell newShell = new Shell(shell);
                    newShell.setLayout(new FillLayout());
                    Composite oldParent = sc.getParent();
                    oldParent.setRedraw(false);
                    sc.setParent(newShell);
                    newShell.open();
                    sc.print(gc);
                    sc.setParent(oldParent);
                    oldParent.setRedraw(true);

                    gc.dispose();
                    newShell.dispose();

                    loader.data = new ImageData[] { image.getImageData() };
                    loader.save("./out.png", SWT.IMAGE_PNG);
                }
            });
        }

        sc.setMinSize(innerComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        sc.setContent(innerComposite);
        sc.setExpandHorizontal(true);
        sc.setExpandVertical(true);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10886789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档