Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Тестирование контрола DataGrid


Автор: VOS 31.1.2007, 15:02
В одном довольно большом моем проекте возникла необходимость реализации клиентской части, 
которая работала бы на мобильных телефонах. Одним из ключевых элементов этой клиентской части
является DataGrid, предназначенный для хранения, отображения и манипулирования данными в плоской двумерной таблице.
В Java (тем более J2ME) я новичок, поэтому с удивлением обнаружил, что этот элемент не входит в состав стандартных контролов.
Поиск не дал приемлемых результатов, поэтому пришлось реализовывать самому. Тестовый мидлет прикреплен к сообщению.
По идее эта версия должна работать на MIDP 1.0 (extends Canvas) (для MIDP 2.0 будет и версия extends CustomItem)

Интересует:
 - приемлимо ли он работает на телефонах с MIDP 1.0 (мерцание и т.д. при включенном/отключенном меню Draw buffered)
 - список телефонов на которых работает
 - мнения/предложения/пожелания

Если контрол кого-то заинтересует, то вот краткое описание
Код


/**
 * Класс DataGrid предназначен для хранения, отображения и манипулирования
 * данными в плоской двумерной таблице
 * Поддерживаются:
 * Автоматический пропорциональный скролллинг записей в таблице
 *       + Вертикальный скроллинг
 *       - Горизонтальный скроллинг (Next version)
 * + Отрисовка сетки таблицы
 *      + ColLines
 *      + RowLines
 * + Выделение ячейки или строки (RowSelect)
 * + Колонки таблицы разной ширины
 * + Многострочные ячейки (устанавливается кол-во строк в таблице)
 * - Строки разной ширины (Next Version)
 * - Объединенные ячейки (Next Version)
 * + WordWrap
 * + Отрисовка изображений в ячейке согласно стилю FieldAttrib.TypeDraw
 * + Видимые и скрытые столбцы
 * + Автоматически вычисляемая ширина последнего видимого столбца под размер экрана
 * + Фиксированные строки (используемые обычно в качестве заголовка таблицы)
 *      + Фиксированных строк (заголовков) может быть несколько
 *      + Цвет устанавливается :)
 * + "Подвал" (footer) таблицы. Это фиксированные строки с объединенными ячейками,
      размещенные внизу таблицы для отображения в зависимости от стиля (StyleDrawInFooter):
 *      + значений столбцов активной строки, у которых атрибут DrawInFooter=true
 *      + статического текста
 *      + статический текста и значение столбца активной строки, у которых атрибут DrawInFooter=true
 *      - суммы значений (next version)
 *      + количества записей в таблице
 *      + количества записей в таблице и значение столбца активной строки, у которых атрибут DrawInFooter=true
 *      + строк "подвала" может быть несколько, каждой из них может быть задан свой стиль
 * + Двойная буферизация :)
 * + Установка цвета
 *      + Фиксированных ячеек
 *      + Сетки
 *      + Скроллируемой области
 *      + Подвала таблицы
 *      + Текста фиксированных ячеек
 *      + Текста данных
 * + Форма просмотра строки
 * + TableLoader 
 *      + теговый формат
 *      - XML (Next version)
 * @version 1.1
 */


Автор: javastic 31.1.2007, 16:40
Компонент очень понравился. Глюков не заметил. Добро пожаловать на форум! smile

Автор: VOS 31.1.2007, 16:57
Спасибо, жаль поздно нашел Ваш форум.

Автор: javastic 31.1.2007, 17:27
Лучше поздно, чем никогда... ;)

Автор: Vladimir35 1.2.2007, 10:40
Цитата(VOS @ 31.1.2007,  16:57)
Спасибо, жаль поздно нашел Ваш форум.

К сожалению, это известная проблема.
Вот http://www.mobile-mir.com/forum/viewtopic.php?t=615 Отсортированно по языку и крутости форума.

Забавно, что сановский форум туда не попал (и форумы производителей тоже).

Автор: slider3d 1.2.2007, 14:33
И мне понравился.   smile 
Вот только надо вовремя остановится. Потому что лучшее враг хорошего. 

Автор: Samuil 2.2.2007, 04:50
VOS, Молодец, мне тож оч. понравился smile 

Автор: VOS 2.2.2007, 10:44
Спасибо за отзывы.
И отдельное спасибо Vladimir35 за ссылки.

Вечером добавил горизонтальный скроллиг и там по-мелочи. Правда горизонтальную полосу прокрутки не успел нарисовать, но скроллинг работает. Новый пример во вложении. Если не сложно, напишите на каких телефонах запускали.

Автор: javastic 2.2.2007, 11:52
SE k610i

Автор: Vladimir35 2.2.2007, 12:31
А опенсорс будет? Или хотя бы как библиотека? А собственные клетки можно будет подключать?

Автор: VOS 2.2.2007, 14:18
На следующей неделе планирую довести его до релиза. Мне важно его оттестировать (см. верхний пост), поэтому приглашаются те, кто может помочь в этом ну и в написании/корректировании документации на английском smile Тем кто примет участие в тестировании/написании документации бесплатно предоставлю исходники и право использования в своих проектах. Желательно только упомянуть автора, хотя бы в документации.

По поводу того как  будет распространяться в дальнейшем (free или коммерч.), я еще не решил, т.к. не знаю рынка и как это делается smile
Буду рад получить консультацию.

В библиотеку помимо DataGrid и TableLoader (теги и xml) планирую включить модуль синхронизации с сервером по HTTP с возможностью шифрования трафика.

Клетки/строки и т.д. могут подключаться например так:
Код

        grid = new DataGridEx(Caption,mydisplay,8);
        grid.getColumn(0).setColumnAttrib(20,true,false,1);
        grid.getColumn(1).setColumnAttrib(35,true,true,1);
        grid.getColumn(2).setColumnAttrib(40,true,true,1);
        grid.getColumn(3).setColumnAttrib(50,false,true,1);
        grid.getColumn(4).setColumnAttrib(40,true,true,1);
        grid.getColumn(3).setDrawInFooter(true);
        grid.getColumn(5).setColumnAttrib(60,false,true,1);
        grid.getColumn(6).setColumnAttrib(47,false,true,1);
        grid.getColumn(7).setColumnAttrib(40,false,true,1);
        grid.getColumn(3).setStaticText("Static text: ");
        grid.AutoSizeLastColumn();
        grid.setFixedRowCount(1);
        grid.setFooterRowCount(1);


        Record rec;
        rec=grid.AppendRow();
        rec.setData(0," ");
        rec.setData(1,"№");
        rec.setData(2,"Date");
        rec.setData(3,"Beneficiar");
        rec.setData(4,"Sum");
        rec.setData(5,"Account");
        rec.setData(6,"Bank");
        rec.setData(7,"Type");

        for (int i=0;i<40;i++)
        {
             rec=grid.AppendRow();
             rec.setData(1,String.valueOf(i+1));
             rec.setData(2,"09.08");
             rec.setData(3,"Choose 'RowCount' to view full text № ("+String.valueOf((i+1*10000))+")");
             rec.setData(4,String.valueOf((i+1)*20)+".00");
             rec.setData(5,"0479"+String.valueOf((i+1)*20));
             rec.setData(6,String.valueOf((i+1))+" bank");
             if(i%6==0)
                 rec.setData(7,"In");
              else
                 rec.setData(7,"Out");
         }

        grid.setRowLinesCount(1);
        grid.setDoubleBuffered(false);
        grid.setRowSelect(false);
        grid.refresh();


Автор: javastic 2.2.2007, 15:14
ну тогда ещё надо оформить стандартную доку по классам, методам и интерфейсам.

Автор: slider3d 2.2.2007, 23:20
VOS не думаю что  имеет большую коммерческую ценность. Каждый более - менее опытный программист без труда реализует DataGrid а новички вряд-ли  будут покупать что-то. И в NetBeans есть реализовано что-то подобное.Правда по красоте им до тебя далеко(respect). 

Есть небольшое предложение. Например, если таблица содержит клетку с большим объемом информации сделай так чтобы при наведении курсора по прошествии некоторого времени всплывала как бы подсказка из содержимим которое не видно. Ну, плохо выразился, но идея понятна?

Автор: javastic 2.2.2007, 23:34
Согласен, было бы не плохо вывести это в заголовок - движущийся.

Автор: Vladimir35 3.2.2007, 16:07
Цитата(VOS @ 2.2.2007,  14:18)
Клетки/строки и т.д. могут подключаться например так

Я имел в виду что-то вроде
Код

rec.setData(1,new MyCell());

То есть для клеток есть интерфейс Cell, и я его реализуя, мог бы добавлять свои собственные клетки.

Как обстоят дела с объединенными клетками? Что происходит, если таблица не правильно сформирована?

Автор: Samuil 4.2.2007, 06:55
Vos, А еще балоб лучше если строка длинная, то она сама бы автосколилась. Типа туда сюда ходила, такая реализация есть в программах SMSBOX.

Автор: VOS 5.2.2007, 11:03
Slider3D - идея понятна, очень понравилась. Типа Hint для ячейки. 
Samuil, JavaStick Это типа как в SE ? Согласен. Можно 2 режима - HINT и AUTOSCROLL.


Vladimir35, такого интерфейса пока нет, при создании таблицы надо сразу указывать кол-во полей. Но это исключительно из-за спешки (надо проект сдавать). В Next Version (следующий понедельник) динамические поля обязательно будут, притом что практически ничего менять не надо, т.к. видимые/невидимые уже поддерживаются. Но отрисовку ячеек и т.д. можно переопределять. 
Насчет объединенных ячеек.  Пока недодумал окончательно идеологию. Хочу посоветоваться. Планирую так.
1) в  Record ставить признак объединенных ячеек
2) При отрисоке закрашивать все подряд идущие ячейки с этим признаком и рисовать строку=cell0+" "+cell1 и т.д. под clipWidth равным соответственно сумме Width этих ячеек

Помимо этого хочу добавить возможность отдельно указывать кол-во Lines в фиксированных Row и Footer.

По поводу open source.  Для Free проектов будет Free, для граждан бывшего СССР для любых проектов будет Free (если русский знают, то Free). Единственное требование, ссылка на автора.

Исходники будут доступны после релиза. А релиз после анализа кода профессиональными J2ME программистами (сегодня отдаю). 

Автор: Rais96 7.2.2007, 09:40
Re-  список телефонов на которых работает

на Siemens CX65(MIDP2.0) не работает!

Автор: VOS 7.2.2007, 11:14
Rais96 - уточните симптомы, пожалуйста. После Вашего сообщения проверил на Siemens C75, на нем не реагировал джойстик.
Исправил, теперь работает. Если не сложно, проверьте прикрепленный вариант.
Спасибо за информацию!

Автор: Rais96 7.2.2007, 14:38
Джойстик раньше не работал. Сейчас работает!

Автор: VOS 13.2.2007, 10:06
Уважаемые, кто может помочь в переводе документации на английский и проверке кода (только DataGrid, остальные модули кардинально переделываю)? Боюсь выкладывать непроверенный, т.к. сам недавно в j2me, легко мог не учесть "особенности" разных производителей и т.д. 
В свое время рискнул, взял библиотеку чужую (С++) и потом неделю искал глюк, а найти было сложно, т.к. вместо InterlockedIncrement использовался обычный ++. Не хочу, чтобы потом, когда кто-нибудь будет ее юзать, обо мне те же слова говорил, что я о том разработчике smile

Автор: VOS 16.2.2007, 15:48
Исходники контрола, документация и т.д. размещены на http://www.grid2me.narod.ru
Просьба сообщать о всех замеченных глюках, а также буду рад замечаниям и предложениям.

Автор: VOS 7.3.2007, 13:54
Следующая версия там же. Добавлена поддержка коммуникаторов (реакция на стилус). Проверялось на I-mate (Windows Mobile 2003).

Автор: kapi 21.3.2007, 18:04
инсталю на Моторолу В3Х - матерится. На ємуляторах Мотора выбрасует  эксепшны. А вот на эмуляторе Сименса запустил, что за фигня ??

Автор: VOS 21.3.2007, 21:36
Спасибо за информацию. 
Сейчас готовлю следующую версию. В ней постарался учесть большинство поступивших предложений, в том числе высказанных на этом форуме. 
Моторолы у меня нет, проверить на ней не могу. 
Но есть подозрение, что с загрузкой изображений в демонстрационном примере может быть что-то не так.
Проверялось на нескольких Nokia, Sony Ericsson, Siemens.
На http://www.grid2me.narod.ru лежат исходники прежней версии, в которых исправлены некоторые баги. Буду признателен, если поможете с тестированием на моторолах.


Автор: Dancer 21.3.2007, 22:01
Ну, не знаю, у меня на моторах работало. Одна проблемка с Моторами - это коды кнопок другие, нежели обрабатываются в приложении. Когда ещё исходников не было, я это дело декомпилил и под себя пересобирал. После этого на Моторах, вообще нормально работало.
Особо не тестил, поэтому дельного вряд ли чего посоветую. Но то что на Моторах это работает - готов поручиться.

Автор: VOS 22.3.2007, 12:52
Если не сложно, укажите коды кнопок для Моторолы.

Автор: kapi 22.3.2007, 19:19
VOS,  motorola SoftKeys :  

Left :  +/- 21
Right:  +/- 22

взависимости от модели.

Автор: VOS 23.3.2007, 09:41
Спасибо.

Автор: VOS 28.3.2007, 10:35
В связи с сообщениями по Мотороле, переработал обработчик клавиш и тестовый мидлет. 
Юзаю теперь так:
Код

try{
            int gameAction = getGameAction(keyCode);
            if(traverse(gameAction)) return;
        }
        catch(Exception e) {
            e.printStackTrace();
        }
   // SoftKey
  ...


Размещено здесь: http://www.grid2me.narod.ru
Просьба, присылайте модели телефонов на которых проверяли работоспособность.

Автор: Samuil 29.3.2007, 00:10
VOS, сделай скрол, а то как -то не удобно, порой достает

Автор: VOS 29.3.2007, 10:19
Делаю и горизонтальную полосу прокрутки и чтобы строка сдвигалась.
И для footer можно выставлять несколько строк (иногда удобнее чем скролл строки).

Автор: VOS 20.6.2007, 10:00
1. Добавлен стиль меню (перемещения курсора, дизайн и т.д.)
2. Добавлен Header (стат. текст, располагается перед DataGrid).
    Автоматически форматируется по правилам WordWrap.  
3. Переработан движок, как следствие значительно уменьшено потребление системных ресурсов.

http://grid2me.narod.ru

Автор: JackSoft 29.10.2007, 15:06
К сожалению, на оф.сайте исходники убраны, а очень хотелось бы заюзать такой датагрид в своем проекте...
Есть люди, которые успели получить клас?

P,S, Автору написал, но пока ответа не получил...

Автор: VOS 29.10.2007, 17:22
Исходники отправил на мыло. Присылайте модели телефонов, на которых проверяли работоспособность. 

Автор: zss 29.11.2007, 21:38
VOS, а можно мне тоже библиотеку ?

Автор: VOS 30.11.2007, 10:39
Запустите на своем телефоне тестовый мидлет и пришлите на почту [email protected] результат (работает или глючит). 
Сразу вышлю исходники. На сайте исходники убрал, потому что не знаю как работает на других телефонах/коммуникаторах, на которых у меня нет возможности проверить.  Например выяснилось, что на коммуникаторах с Windows Mobile 2003 
можно ставить эмулятор weme-wm2003-arm-midp20-5.7.1-P-20040723-1833.exe, но он тормозит  на WM 2005/2006. 
А вот при установке midp20en-6_1_0.cab все просто летает.

Автор: VOS 19.12.2007, 14:22
В DataGrid добавлен стиль TabbView (работа с вкладками).
В этом случае заголовок DataGrid преобразуется в вид TabbedPane (как в Swing ) или TabbedNotebook (как в Delphi).
Интерфейсно напоминает компонент Sony Ericsson на вкладке Параметры. 
Позволяет менять шрифт, цвет заливки, текста, границ, активные/неактивные картинки на вкладках и т.д.
Исправлены мелкие баги.
Исходники новой версии буду высылать на след. неделе, т.к. не добавил пока поддержку стилуса на вкладках.
Просьба сообщать о всех замеченных глюках, а также буду рад замечаниям и предложениям

Пример во вложении.

Автор: JackSoft 19.12.2007, 14:34
Очень качественно!
Motorola L7e/L7i, Fly MP220, Nokia S40 - все работает. Жду релиза!

P.S. Очень хорошо смотрится версия на Нокиевском Симбиане!

Автор: VOS 19.12.2007, 14:51
Спасибо! Особенно за Fly MP220!

Автор: VOS 19.12.2007, 16:31
Добавил стилус.

Автор: zss 19.12.2007, 20:33
VOS, прикольно smile а почему ты исходники не сбрасываешь ? Ты собираешься продавать продукт ?

Автор: JackSoft 20.12.2007, 09:45
VOS, есть пожелания. 
1. Сделать что-то типа фильтра на грид. Тоесть в грид вывести все значения, а потом дать условие на ячейку или пару ячеек и Update(). Очень было бы удобно налету перерисовывать грид на тех же данных...
2. Зарисовка ячеек таблицы другим цветом, изменение шрифта с автоподбором ширины. Счас делаю все это наследыванием, но было бы удобно иметь такие методы в базовом классе.
3. Вставлять в ячейку картинки (точно так же счас решается наследованием) и картинку с текстом вместе.

И огромнейшее спасибо за компоненту.

Добавлено @ 09:47
Цитата(zss @ 19.12.2007,  20:33)
VOS, прикольно smile а почему ты исходники не сбрасываешь ? Ты собираешься продавать продукт ?


Читай еще раз что написал, VOS: Исходники новой версии буду высылать на след. неделе, т.к. не добавил пока поддержку стилуса на вкладках.

Очень хороший подарок к Новому Году.
VOS, дай номер кошелька WMZ поддержу твой проектик на пару баксов. Пива заслужил!

Автор: VOS 23.12.2007, 21:03
zss,  исходники не выкладываю, а отправляю по  запросу исключительно ради того, чтобы узнать как работает на разных моделях телефонов/смартфонов/коммуникаторах, какие возникают проблемы.  Бренды в принципе все отработаны, но хотелось бы еще понять как
работает на таких как Alcatel, Hayer, LG ...  ну и Vertu smile  Тестят программисты, а у них очень похожие модели. 
Сейчас около 50 моделей протестированы.  

JackSoft,  достаточно Вашего спасибо smile И Вам спасибо за предложения.
Понемногу перестраиваю идеологически компоненту в стиле Java.
В TabView режиме чтобы добавить картинки на вкладках теперь надо лишь реализовать такой интерфейс 
Код

public interface ITabImage {
    Image getImage(int pos);
    Image getActiveImage(int pos);
}

Аналогично думаю сделать и с отрисовкой конкретных ячеек. 
Для фильтра будет интерфейс IGridFilter с по меньшей мере одним методом 
boolean isFilteredRecord (int y); 
Если вернет true, запись отображается в гриде, false - нет. Ну а внутри любую логику вставляйте.

Автор: zss 23.12.2007, 22:22
Цитата(VOS @  23.12.2007,  21:03 Найти цитируемый пост)
zss,  исходники не выкладываю, а отправляю по  запросу исключительно ради того, чтобы узнать как работает на разных моделях телефонов/смартфонов/коммуникаторах, какие возникают проблемы.

Ну еслия я протестировал компонент, а тут добавилась но вая возможность, то нужно опять просить исходники.

Если вопрос в тестировании, то думаю проблемм тут не будет, т.к. много хотят этот компонент, а альтернатив просто нет - поэтому единственные варианты - писать самому, что лень, либо взять готовый, тоесть твой smile

Автор: VOS 24.12.2007, 10:04
Кому я исходники уже высылал, то автоматом вышлю новую версию. Все почтовые адреса у меня сохраняются. 
Релиз через пару дней. Вчера добавил стили для вкладок- фиксированной ширины и autoresize по ширине экрана.
Думаю делать ли скроллируемые вкладки (если их кол-во не влезает на экран) в этом релизе. 

Автор: VOS 26.12.2007, 12:38
1. Добавил возможность на лету менять шрифты с автоподбором ширины.
2. Режим Custom Draw для ячеек. Для этого надо реализовать интерфейс IDrawCell 
Код

/**
     * 
     * @param ACol     is the column coordinate of the cell
     * @param ARow     is the row coordinate of the cell
     * @param Selected Indicates whether the cell is currently selected.
     * @param width    Specifies the width in pixels of calculated area. If width =0 then width=gurGraph.getClipWidth()
     */
     void drawCell(int ACol, int ARow, boolean Selected, int width);


Например так в режиме Custom Draw можно отрисовывать картинку и текст в одной строке, менять цвета и т.д.:
Код

  /**
     * IDrawCell example
     */
    public void drawCell(int ACol, int ARow, boolean Selected, int width) {
        if (!customDraw) {
            DrawCell(ACol, ARow, Selected, width);
            return;
        }
        if (!isTabview()) {
            if (ACol > 0) {
                DrawCell(ACol, ARow, Selected, width);
                return;
            }
            if (ARow % 3 == 1) {
                DrawImageByClip(okim, getColumn(ACol).getTypeDraw(), width);
            }
        } else {
            if (ARow > 1) {
                DrawImageByClip(okim, getColumn(ACol).getTypeDraw(), 20);
                if (Selected) curGraph.setColor(255, 255, 255);
                else curGraph.setColor(0);
                DrawTextByClip(getCell(ACol, ARow), getColumn(ACol).getTypeDraw(), width,0,16);
            }
        }
    }

3. Сгенерировал новую доку и выложил на сайте.

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

Автор: VOS 9.1.2008, 17:14
Исправил мелкие ошибки, добавил возможность градиентного заполнения (меню Custom Draw).
Градиент на эмуляторе коряво отображается, а на телефоне нормально.
Взял пример, который работал с плавающими числами и преобразовал его для CLDC 1.0 
Посмотрите, pls, может у кого есть получше реализация. 
Но мне надо чтобы работал на MIDP 1.0 

Код

   public static void gradientFill( Graphics g, int x, int y, int width, int height,
            boolean fillVertically,  int primaryColor, int secondaryColor, int maxSecondary) {

        int p,v,v2,red,green,blue;

        // Выделить RGB составляющие 1 цвета .
        int pr = (primaryColor & 0x00FF0000) >> 16;
        int pg = (primaryColor & 0x0000FF00) >> 8;
        int pb = (primaryColor & 0x000000FF);

         // Выделить RGB составляющие 2 цвета .
        int sr = (secondaryColor & 0x00FF0000) >> 16;
        int sg = (secondaryColor & 0x0000FF00) >> 8;
        int sb = (secondaryColor & 0x000000FF);


        int end = (fillVertically ? height : width);

        for (int i = 0; i < end; i++) {
            // Вычислить текущий цвет для линии
            
            p = i * 100 / end;
            v = Math.abs(maxSecondary - p);
            v2 = 100 - v;

            red = pr * v/100 + sr * v2 / 100;
            green = pg * v/100 + sg * v2 / 100;
            blue = pb * v/100 + sb * v2 / 100;

            g.setColor(red, green, blue);

            // Нарисовать линию, в зависимости от направления градиента.
            if (fillVertically) {
                g.drawLine(x, y + i, x + width, y + i);
            } else  
            {
                g.drawLine(x + i, y, x + i, y + height);
            }
        }
    }


Автор: VOS 10.1.2008, 12:41
Спасибо уважаемым администраторам за прекрасную возможность создания собственных блогов. 
Все новости/изменения и т.д. теперь буду выкладывать на http://vingrad.ru/blogs/grid2me

Автор: JackSoft 21.4.2011, 19:04
проект умер? :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)