Релиз Ext GWT (GXT) 2.0
10 июля 2009 Новости, Разработка 10 511 Комментарии (15)
Только что сошедшая с конвейера свежая версия 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:
- Live Charting
Пакет для создания Flash-базированных графиков/диаграмм предоставляет возможность визуализировать данные. Каждая диаграмма «привязывается» напрямую к ListStore, благодаря чему нет надобности заботиться об ее обновлении — все происходит автоматически. Новый класс FlashComponent, расширяющий BoxComponent, предоставляет возможность легкого создания собственных Flash-компонентов. И все это, как и полагается, конструируется и настраивается при помощи объектной Java-модели, без необходимости иметь дело с JSON или XML.
- HTML Editor — Rich Text Editor
Часто востребованный компонент, который теперь доступен для использования (примечание: в предыдущей версии Ext GWT для возможности использования WYSIWYG-редактора приходилось подключать сторонний редактор самостоятельно, мы писали об этом в одном из предыдущих материалов, посвященных Ext GWT — «Интеграция WYSIWYG-редактора TinyMCE»). HtmlEditor — это легковесный WYSIWYG-редактор, который хорошо интегрируется с другими Ext-компонентами а также легко настраивается для использования другий функций, которые могут быть востребованы разработчиками.
- RowEditor
Редактирование строк в гриде (grid) стало намного более легким. RowEditor — еще один замечательный компонент, предоставляющий возможность быстрого редактирования целых строк в гриде. Возможно даже включить режим валидации, в котором используются новые AnchorTips для извещения пользователя обо всех ошибках валидации одновременно.
- Widget Renderer
Теперь стало возможным добавление виджетов в ячейки грида (Grid). Для использования виджетов достаточно взять на вооружение GridCellRenderer и возвратить виджет вместо HTML-фрагмента.
- ButtonGroup
ButtonGroup — это новый компонент, предоставляющий возможность группирования кнопок различных размеров для создания комплексных панелей инструментов, что позволяет пользователям быстро находить кнопки для выполнения наиболее часто используемых операций.
- Status
Новый компонент Status может быть использован совместно с компонентом ToolBar для дублирования строки состояния приложения.
- HBoxLayout & VBoxLayout
Две новых и чрезвычайно гибких схемы расположения компонентов (layouts) для размещения последних в виде единственной строки или колонки. Эти Box-layouts предоставляют возможность точного контроля размеров и позиции компонентов в контейнере.
Улучшенные компоненты и возможности
- Улучшения компонента Grid
Добавлены две новые возможности:
1. Группирование колонок, что разрешает использование многоколоночных заголовков с поддержкой colspan и rowspan. В дополнение к этому, в заголовках можно также разместить виджеты.
Следующий ниже код демонстрирует создание двух строк в сгруппированных колонках: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. Группирование строк, что разрешает добавлять несколько объединенных строк в низ грида. Можно использовать один из нескольких предопределенных типов агрегации, таких как максимальное, минимальное, усредненное и т.п. значение, или же использовать рендереры для отображение любых данных.
Следующий ниже код демонстрирует создание единственной сгруппированной строки: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, что разрешает использовать их при манипуляциях со схемами расположения. Кнопки теперь могут масштабироваться к любой высоте и ширине и использовать продвинутое позиционирование текста.
- Toolbar Overflow
Панели инструментов (toolbars) теперь могут создавать меню для элементов, которые не помещаются в их видимую область. Эти элементы меню реагируют на события теми же обработчиками (handlers), что и обычные элементы меню. Такое поведение панелей инструментов включено по умолчанию и может быть отключено при помощи конфигурационной опции enableOverflow.
- Menu Overflow
Меню теперь тоже обрабатывают переполнение более обходительным способом: когда меню становится столь длинным, что его элементы не помещаются в видимую область, пользователю предоставляются простые в управлении контроллеры для прокрутки меню. Это свойство включено по умолчанию и может быть отключено при помощи конфигурационной опции enableScrolling.
- ToolTips
Всплывающие подсказки теперь поддерживают специальную «прикрепляющую настройку», которая разрешает обратить внимание к определенному элементу/компоненту при помощи маленькой выносной стрелки.
- Buffered GridView
Буферизированный компонент GridView улучшает быстродействие грида путем ожидания видимости строк перед их рендерингом. При прокрутке пользователем контента, который становится невидимым, BufferedGridView очищает старую DOM-разметку для минимизации DOM-структуры. Как результат минимизированной разметки, быстродействие изменения размеров (resizing) и таких манипуляционных свойств как forceFit, autoExpandColumn и т.п. в больших гридах существенно повышено.
- ImageBundle Support
Поддержка «связки изображений» (image bundle) — одна из часто запрашиваемых возможностей, которая теперь доступна для использования. Иконки могут быть заданы тремя разными способами:
- AbstractImagePrototype (обычно из ImageBundle)
- CSS style name (существующий метод)
- 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.
Ссылки
*
* (все примеры сопровождаются исходным кодом)
*














Спасибо
Извиняюсь за столь долгий ответ, но может кому-нибудь будет полезно

Прямо у ColumnConfig'a есть метод setWidget
Все гораздо проще, чем ожидалось
"Есть предположения почему она исчезает" ето скорей всего баг
попробуйте вызвать в панели метод layout(); вместо collapse
все уже перепробовали… Разобрались в том, что она не исчезает, а grid получает размеры (высоту) больше чем видимая область и скрывается за кнопками ContentPanel
Т.е. после hide и вновь show окна на котором FormPanel — Grid-ины меняют свой размер — высота увеличиваеться…. странно… но почему???
засетайте ContentPanel FitLayout
Проблему не решило… Странно просто как-кто… Есть вторая подобная форма — там там отрабатывает нормально… а на этой глючит… прикол.. Решили проблему только тем, что после отображения формы меняем размеры панелей (высоту) на 1 и обратно…. — тогда они перерисовывают содержимое и все в порядке… Конечно костыль, а что делать… Может знает кто как послать гриду сообщение типа перерисуйся или размер изменился :::???
у каждого компонента есть layout() ,layout(true) и recalculate()б конешно можна нужный ивент запустить вручную fireEvent(Events….);
скорей всего у вас намучено с леяутами и панелями раз такая проблема возникает или вызываете layout() до того как панель отобразилась. надо смотреть код чтобы опредилить что у вас не так
Не подскажите, как можно получить размеры (ширину и высоту) доступной области для отображения браузера. Дело в том, что устанавливая setHeight("90%") — не работает. в то время как setWidth("90%") — работает… Или я не понимаю что-то. Возможно высота не ограничена в браузере, т. к. типа страницы загружаются вниз до бесконечности???
работаем с GXT…
Вопрос стоит так — Задать высоту окна относительно видимой области браузера
Тема закрыта — нарыл:
XDOM.getDocumentWidth,
XDOM.getDocumentHeight,
Видимая область
XDOM.getViewportWidth()
XDOM.getViewportHeight()
Есть ли у кого соображения — после создания окна
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();
}
У меня работает
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);
Да, но у Вас на окне нет дочерних компонентов… от них может зависить размер окна как я понял
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));
ели у вас не получается давайте свой пример попробую.