2013-11-01 3 views
1

swt TreeViewer를 png 파일로 인쇄하려고합니다. 다음을 포함합니다 :스크롤 막대에 의해 숨겨진 경우에도 swt 구성 요소를 인쇄합니다.

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 구성 요소는이를 알 수없는 것 같습니다.

답변

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(); 
} 

눌러 파일을 저장합니다.

+0

'Tree'가 크기가 커서 (화면 크기를 조정 한 후에) 화면에 맞춰지더라도 제대로 작동합니까? 정확히 내가 무엇을 찾고 있었는지 – Baz

+0

. 나는 다시 그리기를 비활성화하는 것에 대해 생각해 본 적이 없었습니다. 대단히 감사합니다 !!!! –

+0

@Baz 1000 개의 항목으로 테스트를했는데 모니터가 크지 만 큰 것은 아니 었습니다. – andi