Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 让SWT浏览器将其输出渲染到图像_Java_Image_Browser_Swt_Render - Fatal编程技术网

Java 让SWT浏览器将其输出渲染到图像

Java 让SWT浏览器将其输出渲染到图像,java,image,browser,swt,render,Java,Image,Browser,Swt,Render,我正在开发一个Java/EclipseSWT应用程序,它以堆叠的方式显示和编辑由特殊设备捕获的地图数据,也就是说,有不同的“地理空间特征”层可以显示/隐藏或修改。人们发现,拥有一个可以轻松检索的航空图像层(例如,从谷歌地图中检索)是很有帮助的 我想到了使用SWT浏览器小部件来检索和渲染这个卫星视图,它实际上就像一个魔咒。问题是我需要一个隐藏的浏览器小部件,它可以在后台工作,并返回渲染内容的swt.graphics.Image等或者更好地直接使用给定的GC进行绘图 我也考虑过更简单的解决方案,但有


我正在开发一个Java/EclipseSWT应用程序,它以堆叠的方式显示和编辑由特殊设备捕获的地图数据,也就是说,有不同的“地理空间特征”层可以显示/隐藏或修改。人们发现,拥有一个可以轻松检索的航空图像层(例如,从谷歌地图中检索)是很有帮助的

我想到了使用SWT浏览器小部件来检索和渲染这个卫星视图,它实际上就像一个魔咒。问题是我需要一个隐藏的浏览器小部件,它可以在后台工作,并返回渲染内容的swt.graphics.Image等或者更好地直接使用给定的GC进行绘图

我也考虑过更简单的解决方案,但有两个限制:

  • 我不能只使用谷歌的静态地图,因为我需要的地图块必须比它们允许的大,并且它们提供的部分重新加载(例如,在移动地图视图端口时)也非常方便
  • 我不能简单地将数据输入谷歌地图,原因有几个

  • 一般来说:如何让浏览器小部件的(隐藏)实例将其输出呈现给Image/GC而不是屏幕。除了浏览器小部件之外,还有其他什么可以完成这项工作吗?

    我认为您可以使用
    org.eclipse.swt.widgets.Control.print(GC)
    将控件打印到图像上。但我还没有在浏览器上试用过它。

    这里是使用
    SWT浏览器
    控件的示例

      public static void main(String[] args) {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setText("Browser Test");
        shell.setSize(500, 500);
        shell.setLayout(new GridLayout(1,false));
    
        final Browser browser = new Browser(shell, SWT.NONE);
    
        browser.setUrl("https://maps.google.com/maps?hl=en&tab=wl");
        //browser.setVisible(false);
        browser.setLayoutData(new GridData(GridData.FILL_BOTH));
    
        Button b = new Button(shell, SWT.NONE);
        b.setText("Show");
        b.addListener(SWT.Selection, new Listener() {
    
            @Override
            public void handleEvent(Event event) {
    
    
                Image img = new Image(display, 500, 500);
                GC gc = new GC(img);
                browser.print(gc);
                gc.dispose();
    
                showImage(img);
    
            }
        });
    
        shell.open();
        while (!shell.isDisposed()) {
          if (!display.readAndDispatch())
            display.sleep();
        }
        display.dispose();
      }
    
    
    private static class ImageDialog extends Dialog
    {
    
        private Image img;
    
        protected ImageDialog(Shell parentShell,Image img) {
            super(parentShell);
            this.img = img;
        }
        @Override
        protected Control createDialogArea(Composite parent) {
    
            Composite comp =  (Composite) super.createDialogArea(parent);
    
            Label lbl = new Label(comp,SWT.NONE);
    
            lbl.setImage(img);
    
            return comp;
        }
    
        @Override
        protected void okPressed() {
            img.dispose();
            super.okPressed();
        }
    
    }
    protected static void showImage(Image img) {
    
        ImageDialog dialog = new ImageDialog(Display.getDefault().getActiveShell(), img);
        dialog.open();
    
    }
    
    我们可以想到的另一种方法

    将java脚本执行到SWT浏览器中。执行(java脚本)将div捕获到图像中