Eclipse4 RCP 指南

练习:用 Swt 浏览器插件

实现

本练习将在 SWT 浏览器控件中显示 Google 地图。

注意:本练习在 Linux 系统上可能工作不正常,因为浏览器控件的某些 Linux 版本不能正常工作,参考 Eclipse SWT FAQ How do I use the WebKit renderer on Linux-GTK 的答案。

修改 PlaygroundPart 类,让 Part 看起来如下:

注意:如果 Google 修改了它的 API 的话,本例子也可能不能工作。

如果你在 text 字段输入文字,然后点击按钮,地图应该基于 text 字段中的输入居中,输入应该为城市。

方案

PlaygroundPart类的代码看起来如下:

package com.example.e4.rcp.todo.parts;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

import javax.annotation.PostConstruct;

import org.eclipse.e4.ui.di.Focus;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;

public class PlaygroundPart {
  private Text text;
  private Browser browser;

  @PostConstruct
  public void createControls(Composite parent) {
    parent.setLayout(new GridLayout(2, false));

    text = new Text(parent, SWT.BORDER);
    text.setMessage("Enter City");
    text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));

    Button button = new Button(parent, SWT.PUSH);
    button.setText("Search");
    button.addSelectionListener(new SelectionAdapter() {
      @Override
      public void widgetSelected(SelectionEvent e) {
        String city = text.getText();
        if (city.isEmpty()) {
          return;
        }
        try {
          // not supported at the moment by Google
          // browser.setUrl("http://maps.google.com/maps?q="
          // + URLEncoder.encode(city, "UTF-8")
          // + "&output=embed");
          browser.setUrl("https://www.google.com/maps/place/"
              + URLEncoder.encode(city, "UTF-8")
              + "/&output=embed");

        } catch (UnsupportedEncodingException e1) {
          e1.printStackTrace();
        }
      }
    });

    browser = new Browser(parent, SWT.NONE);
    browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1));
  }

  @Focus
  public void onFocus() {
    text.setFocus();
  }
}

在文本框中收入new york 试试。