Поиск по этому блогу

Показаны сообщения с ярлыком GWT. Показать все сообщения
Показаны сообщения с ярлыком GWT. Показать все сообщения

вторник, 25 августа 2015 г.

jQuery programming scroll in GWT

Программно прокрутить скрол до нужного элемента можно при помощи jQuery следующим образом. Нужно использовать метод animate() и метод scrollTop() в нем. Параметр 2000 задержка - это анимация. Если он равен 0, то прокрутка происходит мгновенно.

$("#button").click(function() {
    $('html, body').animate({
        scrollTop: $("#elementtoScrollToID").offset().top
    }, 2000);
});

Как это реализовать в GWT.

private native void jQueryScrollCalendar(elementId) /*-{
  $wnd.jQuery("#scrollContainer").animate({
   scrollTop: $wnd.jQuery("#" + elementId).offset().top}, 0);
 }-*/;
 


Источники 

1. http://stackoverflow.com/questions/6677035/jquery-scroll-to-element

Guava Lists.partition + gae objectify

Загружать данные из datastore при помощи objectify можно группами(то есть по частям). Для этого можно использовать средства из библиотеке Guava. Это метод Lists.partition, в который передаем два параметра - список ключей и количество элементов в группе (например 25).

for (List<String> list : Lists.partition(new ArrayList<>(ids), 25))

 Подготовленный лист с ключами передаем в метод ids и получаем список значений.

result.addAll(ofy().load().type(UserEntity.class).ids(list).values());


public List<UserEntity> getUserEntities(Collection<Long> userIds, Long systemId) {
    List<UserEntity> result = new ArrayList<>();
    if (userIds == null) {
      return result;
    }
    List<String> ids = new ArrayList<>();
    for (Long id : userIds) {
      ids.add(UserEntity.generateKey(systemId, id));
    }
    for (List<String> list : Lists.partition(new ArrayList<>(ids), 25)) {
      result.addAll(ofy().load().type(UserEntity.class).ids(list).values());
    }
    return result;
 }





jQuery get scroll position - scrollTop()


Для того,  чтобы узнать величину отступа прокрутки от верхней границы необходимо использовать метод scrollTop(). Этим же методом можно и задать значение отступа прокрутки, передав туда параметр - scrollTop(value).
В GWT для использования jQuery нужно писать $wnd.jQuery вместо $.

@Overridepublic void setCurrentScrollPosition() {
    currentScrollPosition = getCurrentScrollPosition();
}
 
private native int getCurrentScrollPosition() /*-{   
    return $wnd.jQuery("#scrollContainer").scrollTop(); }-*/;
 
@Overridepublic void scrollCalendar() {
    if (currentScrollPosition > 0) {
        jQueryScrollCalendar(currentScrollPosition);   
    }
}
 
private native void jQueryScrollCalendar(int position) /*-{   
    $wnd.jQuery("#scrollContainer").animate({scrollTop: position}, 0);}-*/;

Источники

понедельник, 19 января 2015 г.

Java оператор instanceof

Оператор instanceof предназначен для того, чтобы определять от какого класса произошел объект. Он может быть нужен в тех случаях, когда мы не знаем точно, объект какого класса к нам вернется и необходимо проверить к какому классу относится полученный объект и в зависимости от этого уже действовать дальше. А также, если какой то объект может содержать другие объекты разных классов, но наследников одного предка, у каждого из которых есть различные методы, которые нам необходимо вызывать.

Рассмотрим пример с GWT. Допустим мы в панель класса SimplePanel добавляем в зависимости от условия либо объект созданного нами класса ListDropDownWidget, либо объект класса Anchor. Оба этих объекта являются виджетами.

SimplePanel panel = new SimplePanel();
if (question.getQuestionType() == QuestionType.CHECKBOXES)
  ListDropdownWidget dropdown = new ListDropdownWidget();
  panel.setWidget(dropdown);
} else {
  String title = "Title";
  Anchor a = new Anchor(title);
  panel.add(a);
}

Теперь нам необходимо перевести содержимое этой панели в состояние readOnly. Для этого нужно получить виджет, который содержится в панели. А в панели может содержаться 2 типа виджетов, как было сказано выше. Поэтому после того, как мы получаем виджет, который содержался в панели, необходимо определить к какому классу он относится. Вот здесь и используется опреатор instanceof. Если содержащийся в панели виджет является объектом класса ListDropdownWidget, то приводим полученный виджет к этому классу и вызываем соответствующий метод. По такой же логике действуем, если виджет является объектом класса Anchor.

public void setReadOnly(boolean readOnly) {
  Widget widget = panel.getWidget(); 
  if (null != widget) { 
    if (widget instanceof ListDropdownWidget) {
      ListDropdownWidget dropdown = ListDropdownWidget widget;
      dropdown.setReadonly(readOnly); 
    } else if (widget instanceof Anchor) {
      Anchor a = (Anchor) widget;
      a.setEnabled(!readOnly);
    }
  }
}

суббота, 11 октября 2014 г.

GWT TextBox Placeholder

В GWT у виджета TextBox нету поля placeholder. Поэтому чтобы его добавить необходимо выполнить следующие действия.

Допустим у нас имеется виджет TextBox описанный в uiBinder
<g:TextBox ui:field="emailField"></g:TextBox>

Соответствующее ему поле в Java классе
@UiField
TextBox emailField;

Для того чтобы задать placeholder этому виджету, получаем у него элемент и ему задаем атрибут placeholder.
emailField.getElement()
  .setAttribute("placeholder", "Gmail or Google-based email only");

GWT + Bootstrap Tooltips and Popovers. How to hide popover

Tooltip - всплывающая подсказка при наведении курсора мыши на элемент.
Popover - всплывающее окно, появляющееся при клике на элементе.

Официальная документация Bootstrap


Как работают Tooltips в Bootstrap

Как работают Popovers в Bootstrap

Пример работы с Tooltip и Popover


Для того, чтобы у элемента показывался tooltip достаточно написать ему атрибуты
<button type="button" 
  class="btn btn-default" 
  data-toggle="tooltip" 
  data-placement="left" 
  title="Tooltip on left">
  Tooltip on left
</button>

Эти атрибуты определяют следующее

  1. data-toogle = "tooltip" свойство задает что у элемента будет tooltip
  2. data-placement = "left" позиция, в которой будет показываться tooltip
  3. title = "Help text" текст, который будет показываться в tooltip

Теперь для того чтобы по наведению на элемент показывался tooltip необходимо написать код 
$('.btn').tooltip();

Теперь у всех элементов у которых прописан class="btn" и заданы атрибуты title, data-toogle, data-placement будет показываться tooltip при наведении курсора.

Для того, чтобы у элемента по клику показывался popover достаточно написать ему атрибуты
<button type="button" 
  class="btn btn-default" 
  data-container="body" 
  data-toggle="popover" 
  data-placement="top" 
  data-content="Lorem ipsum dolor sit amet, consectetur adipisicing elit.">
  Popover on top
</button>

Тут атрибуты немного поменялись
  1. data-toogle = "popover" теперь у элемента будет pover
  2. data-placement = "top" позиция для popver теперь будет top
  3. data-content = "Popover text" тут задается текст, который будет показываться в Popover

Точно также как и с tooltip для того чтобы popover показывался по клику необходимо написать код 
$('.btn').popover();

Теперь у всех элементов у которых прописан class="btn" и заданы атрибуты data-toogle, data-placement и data-content будет показываться popover при клике.

Как убрать Popover по клику в другом месте


Если с появлением и исчезанием tooltip все просто, он появляется и исчезает при наведении и убирании курсора соответственно. То с Popover ситуации поинтереснее, он появляется по клику на элементе и исчезает тоже по клику на элементе, но нам необходимо чтобы он убирался когда пользователь просто кликает в любое место на экране. Вот демонстрация как это сделать.

Демонстрация как убирать Popover

Вот код который убирает Popover при клике на любое место на экране. Здесь мы слушаем события клика по элементу body, в котором лежат все элементы интерфейса. Далее для всех элементов, у которых есть атрибут data-toggle="popover" мы проверяем условие и если условие выполняется, то убираем Popover.

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        if (!$(this).is(e.target) 
            && $(this).has(e.target).length === 0 
            && $('.popover').has(e.target).length === 0) {
               $(this).popover('hide');
        }
    });
});

GWT + Bootstrap Tooltips and Popovers


Теперь самое интересное - как соединить Bootstrap и GWT. Будем считать что библиотека Bootstrap.js уже подключена к нашему gwt проекту и поэтому мы можем писать нативный JavaScript код и вызывать методы для работы с Tooltip и Popover.  Допустим у нас есть элемент интерфейса, для которого мы хотим показывать tooltip или по клику на него показывать Popover.
Он может быть описан в uiBinder так
<span class="help-text" ui:field="learnMoreButton">Learn More</span>

или так (это для показа Tooltip)
<span ui:field="learnMoreButton"
      class=="has-tooltip-users" 
      title="learn Much More" 
      tooltipPlace="left">Learn More
</span>

В Java классе для него создано соответствующее поле.
@UiField
Element learnMoreButton;

Создадим специальный класс для работы с Tooltip и Popover. В нем мы напишем нативные методы для вызова Bootstrap методов.

Класс BootstrapUtilities  для работы с нативным JavaScript кодом


public class BootstrapUtilities {
 
 public static native void initializeTooltips(String className)/*-{
  $wnd.$('.' + className).tooltip('destroy');
  $wnd.$('.' + className).tooltip();
 }-*/;
 
 public static void initializeTooltip(Element element, 
            String position, String title) {
  element.setAttribute("data-toggle", "tooltip");
  element.setAttribute("data-placement", position);
  element.setAttribute("title", title);
  initializeTooltip(element);
 }
 
 public static native void initializeTooltip(Element element)/*-{
  $wnd.$(element).tooltip();
 }-*/;
 
 public static native void initializePopover(Element element)/*-{
  $wnd.$(element).popover();
 }-*/;
 
 public static void initializePopover(Element element, String position, 
   String content) {
  element.setAttribute("data-toggle", "popover");
  element.setAttribute("data-placement", position);
  element.setAttribute("data-content", content);
  initializePopover(element);
 };
 
 public static native void hidePopover(Element element)/*-{
  $wnd.$(element).popover('hide');
 }-*/;
 
}
 

Все что нам теперь осталось - это просто обратится к методам из класса BootstrapUtilities для того, чтобы показывать Tooltip или Popover.

Теперь для всех элементов у которых прописан class="has-tooltip-users" будет показываться tooltip.
BootstrapUtilities.initializeTooltips("has-tooltip-users");

Теперь по клику на элемент learnMoreButton будет показываться Popover.
BootstrapUtilities.initializePopover(learnMoreButton, "top", message);


Как в GWT убрать появившийся Popover


Для этого нам понадобится специальное поле типа Long, в котором мы будем хранить время, когда был произведен клик по элементу. 
private Long learnMoreClicked;

В момент клика по элементу мы будем запоминать время
learnMoreClicked = System.currentTimeMillis();

Далее при нажатии по свободному месту на экране мы будем отслеживать, что с момента клика по элементу, к которому привязан Popover прошло более 250 миллисекунд.
System.currentTimeMillis() - learnMoreClicked > 250

RootPanel - корневая панель, в которой содержаться все элементы интерфейса. Поэтому нужно слушать клики пользователя по этой панели, чтобы убирать Popover.

Вешаем слушателя событий на кнопку и тут же подписываем RootPanel на событие Click. Также запоминаем время клика.
Event.sinkEvents(learnMoreButton, Event.ONCLICK);
Event.setEventListener(learnMoreButton, new EventListener() {
 
    @Override
    public void onBrowserEvent(Event event) {
      RootPanel.get().sinkEvents(Event.ONCLICK);
      learnMoreClicked = System.currentTimeMillis();
    }
 
});

Вешаем слушателя событий на RootPanel и при выполнении условия, что с момента клика по элементу до момента клика по RootPanel прошло более 250 миллисекунд
убираем Popover и отписываем панель от слушания событий
RootPanel.get().addHandler(new ClickHandler() {
 
    @Override
    public void onClick(ClickEvent event) {
 if (learnMoreClicked != null 
          && System.currentTimeMillis() - learnMoreClicked > 250) {
         BootstrapUtilities.hidePopover(learnMoreButton);
  RootPanel.get().unsinkEvents(Event.ONCLICK);
 }
    }
}, ClickEvent.getType());

Убирается Popover c помощью метода hidePopover() из класса BootstrapUtilities
BootstrapUtilities.hidePopover(learnMoreButton);

public static native void hidePopover(Element element)/*-{
  $wnd.$(element).popover('hide');
 }-*/;

понедельник, 14 июля 2014 г.

Guava. Filter Collections and Iterables

Guava - это библиотека, предоставляющая возможности функционального программирования.

Guava на Google Code

Guava на Wikipedia

Зависимость в POM.XML файле проекта (Если используем Maven для проекта)
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>${guavaVersion}</version>
</dependency>


Фильтруем List

Для фильтрации List'a следующие классы необходимо импортировать.
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;

Объявляем объект, реализующий интерфейс List.
private List<Document> displayList;

Фильтруем наш displayList. Создаем новый лист на основе исходного, но при этом в новый лист попадут только те элементы которые будут соответствовать условию, указанному в предикате. Например, тут в листе будут содержаться только не архивные документы.
displayList = Lists.newArrayList(
    Collections2.filter(displayList, new Predicate<Document>() { 
 
      @Override
      public boolean apply(Document document) {
        return !document.isArchived();
      }
    })
);
 
setupView(displayList);

Фильтруем Iterables

Для фильтрации Iterables следующие классы необходимо импортировать.
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

Создаем список реализующий интерфейс List, он будет содержать объекты класса SchemaItem.
private List<SchemaItem> attributeList;

Допустим у нас есть объект класса Schema, который содержит в себе объекты SchemaItem и реализует интерфейс Iterable.
public class Schema implements Iterable<SchemaItem>

Фильтрованный лист будет создан на основе объекта реализующего интерфейс Iterable и содержащего объекты класса SchemaItem. В него попадут только те элементы, которые будут соответствовать условию в предикате.
attributeList = Lists.newArrayList(
  Iterables.filter(result, new Predicate<SchemaItem>() { 
 
    @Override
    public boolean apply(SchemaItem si) {
      return (si.getSearchable());
    }
  ));
setupView(attributeList);

пятница, 11 июля 2014 г.

Становимся экспертами в GWT или GWT in Action

Очень познавательная книжка по технологии GWT. Подойдет для всех категорий читателей, как для тех, кто уже знаком с GWT и хочет разобраться поглубже, так и для тех, кто будет изучать GWT с нуля.

GWT in Action, Second Edition




GWT. Maven GWT Plugin commands


1. GWT Maven Plugin 

    http://mojo.codehaus.org/gwt-maven-plugin/

Этот плагин предназначен для запуска gwt проектов с помощью Maven.

<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwtVersion}</version>

1. mvn gwt:eclipse создаст Launch файл для запуска проект из Eclipse

2. mvn gwt:run запустит проект на AppEngine

3. mvn gwt:debug запустит проект на AppEngine в debug mode



2. Appengine Maven Plugin 



Этот плагин предназначен для запуска с помощью Maven сервера AppEngine
   
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>

1. mvn appengine:devserver эта команда запустит локальный dev сервер AppEngine 

2. mvn appengine:devserver -Plocal эта команда запустит локальный dev сервер AppEngine с профилем local, профиль local описывается в POM файле проекта.
<profiles>
  <profile>
    <id>local</id>
      <properties>
        <root.url>http:\/\/localhost:8888</root.url>
      </properties>
  </profile>
</profiles>

3. Профили и параметры Maven


1. mvn clean install -DskipTests  эта команда очистит папку target проекта, после чего скомпилирует файлы проекта и при этом пропустит выполнение тестов.

2. mvn clean install -DskipTests -Pdebugging -DgwtLogLevel=INFO для того, чтобы выполнилась такая команда необходимо добавить профиль в POM файл проекта для параметра Pdebugging, другие два параметра являются параметрами встроенными в Maven.
<profiles>
<profile>
  <id>debugging</id>
    <properties>
      // уровень логгирования
      <gwtLogLevel>TRACE</gwtLogLevel>
      // количество выделяемой памяти
      <gwtDebugJvm>-Xmx2048m -XX:MaxPermSize=2048m</gwtDebugJvm>
      // пропустить тесты
      <skipTests>true</skipTests>
    </properties>
  </profile>
<profile>
</profiles>

вторник, 1 июля 2014 г.

GWT. Programatically selecting text in a TextBox

Для того, чтобы по нажатию на компонент выделить текст, который в нем находится, необходимо написать следующий нативный метод. В качестве параметра передаем в метод тот элемент, в котором будем выделять текст.
private native void selectAll(Element element) /*-{
     element.setSelectionRange(0, element.value.length);
}-*/;

И использовать этот метод в обработчике события получения фокуса компонентом.
Event.sinkEvents(selector.getInputElement(), Event.ONFOCUS);
Event.setEventListener(selector.getInputElement(), 
  new EventListener() {
 
    @Override
    public void onBrowserEvent(Event event) {
      selectAll(selector.getInputElement());
    }
});

Но часто может происходить следующая ситуация - текст в компоненте будет выделяться после того как пользователь поставит курсор внутри компонента, однако после этого выделение будет слетать. Это происходит потому что выделение может быть установлено еще до того как выполнятся все события связанные с отрисовкой интерфейса. Поэтому необходимо использовать очередь событий и вызывать метод, который будет выделять текст только после того как все события интерфейса будут выполнены. Для этого нам понадобится метод
Scheduler.get().scheduleDeferred() 

Добавим в очередь событий вызов метода выделения текста в компоненте.
Scheduler.get().scheduleDeferred(
  new Scheduler.ScheduledCommand() {
    public void execute() {
      selectAll(selector.getInputElement());
    }
});

Полностью код будет выглядеть так
Event.sinkEvents(selector.getInputElement(), Event.ONFOCUS);
Event.setEventListener(selector.getInputElement(), 
  new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
      openDropdown(true);
      currentValue = selector.getText();
      Scheduler.get().scheduleDeferred(
        new Scheduler.ScheduledCommand() {
          public void execute() {
            selectAll(selector.getInputElement());
          }
        });
      }
  });

воскресенье, 29 июня 2014 г.

Google Guava Splitter Example

Разобрать строку в GWT можно с помощью библиотеки Guava. Вот пример как это сделать.

Описание библиотеки на Wikipedia

Скачать библиотеку Guava

Пример использования Guava
String str = "This;is test;string with;semicolons";
Iterable<String> result = Splitter.on(";").trimResults() 
    .omitEmptyStrings() 
    .split(str); 
StringBuilder sb = new StringBuilder(); 
for (String s : result) { 
  sb.append(s + "\n"); 
} 
System.out.print(sb.toString()); 

Результат работы

понедельник, 26 мая 2014 г.

GWT. How to create and use custom widget

Как в GWT создать собственный виджет и использовать его после этого как при помощи Java кода так и при помощи uiBinder. Прежде всего создадим два файла - java класс для нашего виджета и xml-файл, в котором опишем структуру нашего виджета.

ModalDialogWidget.java
ModalDialogWidget.ui.xml

Наш виджет будет наследоваться от класса Composite.
public class ModalDialogWidget extends Composite

Внутри нашего виджета создадим интерфейс, который будет расширять UiBinder. После этого создадим статическую переменную типа созданного интерфейса (переменная uiBinder). Она нам понадобится в дальнейшем для связывания xml описания файла с Java кодом.
interface ModalDialogWidgetUiBinder extends
  UiBinder<Widget, ModalDialogWidget> {
}
 
private static ModalDialogWidgetUiBinder uiBinder = GWT
  .create(ModalDialogWidgetUiBinder.class);

среда, 14 мая 2014 г.

GWT. How to add Handler on DOM elements

Для того, чтобы в GWT прикрепить EventListener на простой DOM Element необходимо сделать следующее.
final Element element = selector.getInputElement();  
Event.sinkEvents(element, Event.ONKEYUP);
Event.setEventListener(element, new EventListener() {
 
    @Override
    public void onBrowserEvent(Event event) {
        if (Event.ONKEYUP == event.getTypeInt()) {
            Window.alert("ONKEYUP ");
        }
    }
});

Но так можно повесить слушатель только для одного события, для нескольких событий необходимо писать код следующим образом.
Event.sinkEvents(element, Event.ONKEYUP | Event.ONBLUR | Event.ONFOCUS);

Такое написание объясняется тем, что события являются битовыми константами.
/**
   * Fired when an element receives keyboard focus.
   */
  public static final int ONFOCUS = 0x00800;

Метод sinkEvents принимает итоговое значение битов.
public static void sinkEvents(Element elem, int eventBits) {
    // This cast is always valid because both Element types are JSOs and have
    // no new fields are added in the subclass.
    DOM.sinkEvents((com.google.gwt.user.client.Element) elem, eventBits);
}

И для прикрепления к элементу слушателя на несколько событий необходимо провести логическую операцию над используемыми событиями.
final Element element = selector.getInputElement();
Event.sinkEvents(element, Event.ONKEYUP | Event.ONBLUR | Event.ONFOCUS);
Event.setEventListener(element, new EventListener() {
 
 @Override
 public void onBrowserEvent(Event event) {
  if (Event.ONKEYUP == event.getTypeInt()) {
      Window.alert("ONKEYUP ");
      event.preventDefault();
  } else if (Event.ONBLUR == event.getTypeInt()) {
     Window.alert("ONBLUR ");
     event.preventDefault();
  } else if (Event.ONFOCUS == event.getTypeInt()) {
     Window.alert("ONFOCUS ");
     event.preventDefault();
  }
 }
});


пятница, 15 марта 2013 г.

GWT RequestBuilder

В GWT есть инструмент для отправки запросов на серевер - это RequestBuilder. При помощи RequestBuilder'а мы можем отправлять REST-запросы на сервер. Работать с RequestBuilder очень просто. Для того чтобы создать объект  RequestBuilder,  необходимо вызвать конструктор с двумя параметрами.
RequestBuilder requestBuilder = new RequestBuilder(httpMethod, url);
httpMethod - метод, который используется запросом при обращении к серверу
url -адрес, по которому отправляется запрос.

Запрос, отправляемый на сервер может быть отправлен при помощи следующих методов

RequestBuilder.POST - добавление данных
RequestBuilder.GET - получение данных
RequestBuilder.PUT - изменение данных
RequestBuilder.DELETE - удаление данных

понедельник, 18 февраля 2013 г.

GWT CellTable Custom Cell. Как в GWT создать свою ячейку в CellTable.

GWT предоставляет множество готовых компонентов и широкие возможности для разработки графических интерфейсов. Но для некоторых задач нет заранее подготовленных компонентов, поэтому возникает необходимость создавать свои собственные. Например, в данном случае мне понадобилось создать свою собственную ячейку таблицы, которая будет выводить данные таким образом как это необходимо мне.
Задача состоит в следующем. Необходимо создать ячейку таблицы, в которой будет выводиться текст, а под ним кнопка. По нажатию на кнопку должно появляться диалоговое окно, после ввода данных в котором, в ячейке должен отображаться только текст без кнопки.


вторник, 21 августа 2012 г.

Небольшой пример работы с JSNI в GWT/GXT


Задача состоит в следующем - по нажатию на кнопку должен сработать переход по ссылке.
Java Script Native Interface позволяет Java разработчику работающему с GWT / GXT использовать в своем коде вставки на чистом JavaScript. У элемента ссылка есть метод click(), именно его мы и будем вызывать при помощи JSNI.

import com.extjs.gxt.ui.client.widget.Html;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;

public class SomeForm {

  // html фрагмент
  private final Html templateLink;
  // нативный метод, который вызывает метод click() у переданного ему элемента
  public static native void click(final com.google.gwt.dom.client.Element el)
  /*-{
   el.click();}
  -*/;

  // адрес ссылки 
  private static final String TEMPLATE_URI = "some/uri";

  public SomeForm()
  {
    ...
    // создаем кнопку и ее обработчик
    // по щелчку на кнопке вызывается переход по сслыке 
    Button someButton = new Button("Some Button"new SelectionListener<ButtonEvent>() {

      @Override
      public void componentSelected(final ButtonEvent ce) {

        com.google.gwt.dom.client.Element el =
         Document.get().getElementById("jsniClick");

        click(el);

      }

    });
    // добавляем кнопку и ссылку на панель
    ContentPanel cpLeft = new ContentPanel();
    cpLeft.setHeaderVisible(false);
    cpLeft.setBodyBorder(false);
    cpLeft.setButtonAlign(HorizontalAlignment.LEFT);

    cpLeft.addButton(someButton);
 
    templateLink = new Html("<a id='jsniClick' href='" + TEMPLATE_URI + "'></a>");

    cpLeft.add(new Label(templateLink.getHtml()));

    add(cpLeft);

  }

}


* This source code was highlighted with Source Code Highlighter.