1

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 コンポーネントはそれを認識していないようです。

4

1 に答える 1

5

まず、画像のサイズは、現在のサイズではなく、スクロールなしのツリーのサイズにする必要があります。そのためには、を使用する必要があります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();
}

Enter キーを押してファイルを保存します。

于 2013-11-01T11:30:43.697 に答える