Java 打印swt组件,即使被滚动条隐藏
我尝试将swt TreeViewer打印为png文件。与: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
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在本例中:)