Избранные Материалы

Релиз Ext GWT (GXT) 2.0

Только что сошедшая с конвейера свежая версия Ext GWT 2.0, впитала в себя, по словам ее разработчиков, массу новых компонентов и возможностей, расширяющих функциональный набор предыдущей версии Ext GWT 1.0. Что наиболее примечательно в данном релизе, так это то, что он, наконец-то, закрыл функциональную брешь (некоторое отставание) между проектом Ext GWT и его «родным братом» Ext JS — теперь оба проекта имеют аналогичный набор возможностей! Напомним, что в отличии от Ext JS, которая является «чистой» JS-библиотекой с мощнейшим функционалом, Ext GWT, в свою очередь, является своего рода «оберткой» к Ext JS и предоставляет разработчикам возможность применить на практике всю ее мощь, однако не требует от разработчиков каких-либо знаний в области JavaScript и избавляет их от проблем кросс-браузерной совместимости соответствующего кода — в процессе разработки используется только один язык программирования — Java (тут также важен тот факт, что архитектура Ext GWT использует возможности языка Java «в лучших традициях» проектирования ПО — фрэймворк спроектирован очень качественно и его API, соответственно, позволяет использовать всю гибкость объектно-ориентированного подхода к построению ПО с использованием языка программирования Java). А это, нужно заметить (особенно учитывая то, что Java является наиболее популярным и развитым объектно-ориентированным языком программирования современности), открывает для Java-разработчиков воистину огромные перспективы в области построения AJAX-базированных RIA-приложений.

Итак, взглянем, что же нового преподнес нам данный релиз.

Новые компоненты и возможности

  • Tree Panel & Tree Grid

Новые компоненты TreePanel и TreeGrid заменяют старые компоненты Tree и TreeTable. Они «привязываются» напрямую к TreeStore и, следовательно, использовавшиеся ранее «соединители» TreeBinder и TreeTableBinder более не нужны. TreeGrid является подклассом Grid, что автоматически наделяет данный компонент всеми достоинствами компонента Grid — быстрым рендерингом, поддержкой виджетов и встроенным/построчным редактированием.

Скриншот, демонстрирующий TreeGrid с использованием RowEditor:

treegrid.gif

Tree Grid

  • Live Charting

Пакет для создания Flash-базированных графиков/диаграмм предоставляет возможность визуализировать данные. Каждая диаграмма «привязывается» напрямую к ListStore, благодаря чему нет надобности заботиться об ее обновлении — все происходит автоматически. Новый класс FlashComponent, расширяющий BoxComponent, предоставляет возможность легкого создания собственных Flash-компонентов. И все это, как и полагается, конструируется и настраивается при помощи объектной Java-модели, без необходимости иметь дело с JSON или XML.

charting2.png

Live Charting

  • HTML Editor — Rich Text Editor

Часто востребованный компонент, который теперь доступен для использования (примечание: в предыдущей версии Ext GWT для возможности использования WYSIWYG-редактора приходилось подключать сторонний редактор самостоятельно, мы писали об этом в одном из предыдущих материалов, посвященных Ext GWT — «Интеграция WYSIWYG-редактора TinyMCE»). HtmlEditor — это легковесный WYSIWYG-редактор, который хорошо интегрируется с другими Ext-компонентами а также легко настраивается для использования другий функций, которые могут быть востребованы разработчиками.

htmleditor.gif

HTML Editor - Rich Text Editor

  • RowEditor

Редактирование строк в гриде (grid) стало намного более легким. RowEditor — еще один замечательный компонент, предоставляющий возможность быстрого редактирования целых строк в гриде. Возможно даже включить режим валидации, в котором используются новые AnchorTips для извещения пользователя обо всех ошибках валидации одновременно.

roweditor.png

RowEditor

  • Widget Renderer

Теперь стало возможным добавление виджетов в ячейки грида (Grid). Для использования виджетов достаточно взять на вооружение GridCellRenderer и возвратить виджет вместо HTML-фрагмента.

widgetgrid.png

Widget Renderer

  • ButtonGroup

ButtonGroup — это новый компонент, предоставляющий возможность группирования кнопок различных размеров для создания комплексных панелей инструментов, что позволяет пользователям быстро находить кнопки для выполнения наиболее часто используемых операций.

ButtonGroup.png

ButtonGroup

  • Status

Новый компонент Status может быть использован совместно с компонентом ToolBar для дублирования строки состояния приложения.

status.png

Status

  • HBoxLayout & VBoxLayout

Две новых и чрезвычайно гибких схемы расположения компонентов (layouts) для размещения последних в виде единственной строки или колонки. Эти Box-layouts предоставляют возможность точного контроля размеров и позиции компонентов в контейнере.

boxlayouts.png

HBoxLayout & VBoxLayout

Улучшенные компоненты и возможности

  • Улучшения компонента Grid

Добавлены две новые возможности:

1. Группирование колонок, что разрешает использование многоколоночных заголовков с поддержкой colspan и rowspan. В дополнение к этому, в заголовках можно также разместить виджеты.

columngrouping.gif

Группирование колонок

Следующий ниже код демонстрирует создание двух строк в сгруппированных колонках:

cm.addHeaderGroup(0, 0, new HeaderGroupConfig("Header Grouping Example", 1, 5));
cm.addHeaderGroup(1, 2, new HeaderGroupConfig("Stock Performance", 1, 2));
cm.addHeaderGroup(1, 0, new HeaderGroupConfig(yourWidget, 1, 2));

2. Группирование строк, что разрешает добавлять несколько объединенных строк в низ грида. Можно использовать один из нескольких предопределенных типов агрегации, таких как максимальное, минимальное, усредненное и т.п. значение, или же использовать рендереры для отображение любых данных.

aggregation.gif

Группирование строк

Следующий ниже код демонстрирует создание единственной сгруппированной строки:

AggregationRowConfig averages = new AggregationRowConfig();
averages.setHtml("name", "Average");

// с типом и форматом суммарного значения
averages.setSummaryType("last", SummaryType.AVG);
averages.setSummaryFormat("last", NumberFormat.getCurrencyFormat());

// с рендерером
averages.setSummaryType("change", SummaryType.AVG);
averages.setRenderer("change", new AggregationRenderer() {
public Object render(Number value, int colIndex, Grid grid, ListStore store) {
// здесь можно возвратить HTML
return number.format(value.doubleValue());
}
});
cm.addAggregationRow(averages);
  • Buttons

Кнопки в Ext GWT 2.0 были переработаны и являются теперь валидными компонентами BoxComponent, что разрешает использовать их при манипуляциях со схемами расположения. Кнопки теперь могут масштабироваться к любой высоте и ширине и использовать продвинутое позиционирование текста.

Buttons.png

Buttons

  • Toolbar Overflow

Панели инструментов (toolbars) теперь могут создавать меню для элементов, которые не помещаются в их видимую область. Эти элементы меню реагируют на события теми же обработчиками (handlers), что и обычные элементы меню. Такое поведение панелей инструментов включено по умолчанию и может быть отключено при помощи конфигурационной опции enableOverflow.

toolbaroverflow.png

Toolbar Overflow

  • Menu Overflow

Меню теперь тоже обрабатывают переполнение более обходительным способом: когда меню становится столь длинным, что его элементы не помещаются в видимую область, пользователю предоставляются простые в управлении контроллеры для прокрутки меню. Это свойство включено по умолчанию и может быть отключено при помощи конфигурационной опции enableScrolling.

menuoverflow.png

Menu Overflow

  • ToolTips

Всплывающие подсказки теперь поддерживают специальную «прикрепляющую настройку», которая разрешает обратить внимание к определенному элементу/компоненту при помощи маленькой выносной стрелки.

anchortip.png

ToolTips

  • Buffered GridView

Буферизированный компонент GridView улучшает быстродействие грида путем ожидания видимости строк перед их рендерингом. При прокрутке пользователем контента, который становится невидимым, BufferedGridView очищает старую DOM-разметку для минимизации DOM-структуры. Как результат минимизированной разметки, быстродействие изменения размеров (resizing) и таких манипуляционных свойств как forceFit, autoExpandColumn и т.п. в больших гридах существенно повышено.

buffergrid.png

Buffered GridView

  • ImageBundle Support

Поддержка «связки изображений» (image bundle) — одна из часто запрашиваемых возможностей, которая теперь доступна для использования. Иконки могут быть заданы тремя разными способами:

  1. AbstractImagePrototype (обычно из ImageBundle)
  2. CSS style name (существующий метод)
  3. Image path (строка)

Все компоненты, поддерживающие иконки, теперь реализовывают новый интерфейс IconSupport:

/**
* Interface for objects that support icons.
*/
public interface IconSupport {
/**
* Returns the icon.
*
* @return the icon
*/
public AbstractImagePrototype getIcon();

/**
* Sets the icon.
*
* @param icon the icon
*/
public void setIcon(AbstractImagePrototype icon);

/**
* Sets the icon style.
*
* @param icon a CSS style name
*/
public void setIconStyle(String icon);
}

В дополнение к этому, существует вспомогательный класс IconHelper, который может быть использован для создания прототипов изображений из названий CSS-стилей и путей к изображениям. Вот пример задания иконки тремя разными способами:

// из "связки"
item.setIcon(GXT.IMAGES.editor_bold());
// имя CSS-стиля
item.setIconStyle("my-icon");
// путь к изображению
item.setIcon(IconHelper.createPath("/my/url/foo.gif"));

Миграция на версию Ext GWT 2.0

Ext GWT 2.0 — это обширное обновление версии 1.0, в котором присутствует ряд «переломных» изменений, которые должны быть приняты к сведению при переходе с версии 1.х. Среди загружаемых файлов Ext GWT присутствует руководство по миграции, в котором задокументированы изменения в API, и с которым рекомендуется ознакомиться перед тем, как начать переход на версию 2.0.

Ссылки

* Страница загрузки Ext GWT 2.0
* Живая демонстрация возможностей Ext GWT 2.0 (все примеры сопровождаются исходным кодом)
* План дальнейшего развития (road map) Ext GWT


Об авторе:
Профессиональный разработчик программного обеспечения, блоггер, адепт Open Source, казуальный путешественник, фотограф-аматор.
Подробнее »
Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong Twitter

Комментарии (15) »

guest [2010-10-15 15:33:12 ]

Спасибо

(Comments wont nest below this level)
 
Станислав [2011-03-26 21:11:56 ]

Извиняюсь за столь долгий ответ, но может кому-нибудь будет полезно ;)
Прямо у ColumnConfig'a есть метод setWidget :)
Все гораздо проще, чем ожидалось

(Comments wont nest below this level)
 
Menestys [2011-05-18 11:41:45 ]

"Есть предположения почему она исчезает" ето скорей всего баг
попробуйте вызвать в панели метод layout(); вместо collapse

(Comments wont nest below this level)
Вячеслав [2011-05-18 16:39:20 ]

все уже перепробовали… Разобрались в том, что она не исчезает, а grid получает размеры (высоту) больше чем видимая область и скрывается за кнопками ContentPanel
Т.е. после hide и вновь show окна на котором FormPanel — Grid-ины меняют свой размер — высота увеличиваеться…. странно… но почему???

Menestys [2011-05-18 16:44:21 ]

засетайте ContentPanel FitLayout :-)

Вячеслав [2011-05-19 11:03:20 ]

Проблему не решило… Странно просто как-кто… Есть вторая подобная форма — там там отрабатывает нормально… а на этой глючит… прикол.. Решили проблему только тем, что после отображения формы меняем размеры панелей (высоту) на 1 и обратно…. — тогда они перерисовывают содержимое и все в порядке… Конечно костыль, а что делать… Может знает кто как послать гриду сообщение типа перерисуйся или размер изменился :::???

Menestys [2011-05-19 13:28:52 ]

у каждого компонента есть layout() ,layout(true) и recalculate()б конешно можна нужный ивент запустить вручную fireEvent(Events….);
скорей всего у вас намучено с леяутами и панелями раз такая проблема возникает или вызываете layout() до того как панель отобразилась. надо смотреть код чтобы опредилить что у вас не так

 
 
 
 
 
Вячеслав [2011-05-24 11:22:28 ]

Не подскажите, как можно получить размеры (ширину и высоту) доступной области для отображения браузера. Дело в том, что устанавливая setHeight("90%") — не работает. в то время как setWidth("90%") — работает… Или я не понимаю что-то. Возможно высота не ограничена в браузере, т. к. типа страницы загружаются вниз до бесконечности???

(Comments wont nest below this level)
Вячеслав [2011-05-24 11:24:50 ]

работаем с GXT…
Вопрос стоит так — Задать высоту окна относительно видимой области браузера

 
 
Вячеслав [2011-05-24 12:14:22 ]

Тема закрыта — нарыл:
XDOM.getDocumentWidth,
XDOM.getDocumentHeight,

(Comments wont nest below this level)
Menestys [2011-05-26 10:50:12 ]

Видимая область
XDOM.getViewportWidth()
XDOM.getViewportHeight()

 
 
Вячеслав [2011-05-24 15:14:03 ]

Есть ли у кого соображения — после создания окна
window = new Window();
Задаем ему
window.setSize((int)(XDOM.getDocumentWidth()*0.9), (int)(XDOM.getDocumentHeight()*0.9));
И показываем окно — show
Все великолепно отрабатывает…
Однако если затем окно закрыть, уменьшить окно браузера. и затем снова окно открыть — то оно первоначального размера.
Метод, отображающий окно — следующий:
if(!window.isVisible()){
setWindowSize(); // здесь задание относительных размеров по примеру выше???
//в дебаге числа нормальные — а размер не меняетя….
window.removeAll();
window.add(formPanel);
window.show();
window.center();
}

(Comments wont nest below this level)
Menestys [2011-05-26 10:48:56 ]

У меня работает
final Window window = new Window();
window.setSize((int) (XDOM.getViewportWidth() * 0.9), (int) (XDOM.getViewportHeight() * 0.9));
window.show();

Button showWindow = new Button("Show", new SelectionListener<ButtonEvent>() {

@Override
public void componentSelected(ButtonEvent ce) {
if (!window.isVisible()) {
window.removeAll();
window.show();
window.setSize((int) (XDOM.getViewportWidth() * 0.9), (int) (XDOM.getViewportHeight() * 0.9));
window.center();
}

}
});
RootPanel.get().add(showWindow);

Вячеслав [2011-05-26 15:49:55 ]

Да, но у Вас на окне нет дочерних компонентов… от них может зависить размер окна как я понял

 
 
 
Menestys [2011-05-27 12:02:44 ]

final Window window = new Window();
window.setLayout(new BorderLayout());
window.setSize((int) (XDOM.getViewportWidth() * 0.9), (int) (XDOM.getViewportHeight() * 0.9));
window.add(new ContentPanel(), new BorderLayoutData(LayoutRegion.CENTER));
window.add(new ContentPanel(), new BorderLayoutData(LayoutRegion.NORTH, 100));
window.add(new ContentPanel(), new BorderLayoutData(LayoutRegion.EAST, 100));
window.add(new ContentPanel(), new BorderLayoutData(LayoutRegion.WEST, 100));
window.add(new ContentPanel(), new BorderLayoutData(LayoutRegion.SOUTH, 100));
window.show();

Button showWindow = new Button("Show", new SelectionListener<ButtonEvent>() {

@Override
public void componentSelected(ButtonEvent ce) {
if (!window.isVisible()) {
// window.removeAll();
window.show();
window.setSize((int) (XDOM.getViewportWidth() * 0.9), (int) (XDOM.getViewportHeight() * 0.9));
window.center();
}

}
});
RootPanel.get().add(showWindow);
У меня результат тотже, окно изменяет размер как и положено.
размер нужно устанавливать после того как окно отобразилось, если окно было уже прежде отрисовано.
window.show();
window.setSize((int) (XDOM.getViewportWidth() * 0.9), (int) (XDOM.getViewportHeight() * 0.9));
ели у вас не получается давайте свой пример попробую.

(Comments wont nest below this level)