Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прозрачный CustomItem: как победить проблему? 
:(
    Опции темы
AleX83Xpert
  Дата 17.12.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



Пишу приложение для телефонов. MIDP-2.0, CLDC-1.0. WindowsXP sp3, Netbeans 6.8, Эмулятор SonyErricsson SDK 2.2.3.
Сделал свой CustomItem и вывожу его в качестве пункта меню на экране телефона. Проблема в том, что если выводится "слишком много" этих пунктов, то они все становятся прозрачными и без текста, который должен в них быть. Тестил на сони эриксонах z310i и k790. Экспериментально проверил, что если пунктов 6, то выводится нормально; 7 и более - прозрачные. А если пункты состоят из 2-х и более сторок, то даже 5 пунктов не отображается. На эмуляторах - все в порядке. Проверил использование памяти мидлетом - порядка 20-100 килобайт.
Такое ощущение, что не вызывается функция paint() в классе моего CustomItem'а.
Может есть какое-то ограничение на количество своих кастомитемов, что как-то абсурдно? О_о
Кто в курсе, подскажите пожалуйста.
Гуглежка результатов не дала.
Вот этот самый CustomItem
Код

package Items;

import Trinco.TrincoClient;
import java.util.Enumeration;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import javax.microedition.lcdui.CustomItem;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;

public class TrincoMenuItem extends CustomItem {

    private String key = "";
    private boolean isSelected = false;
    private int _height = 16;
    private int _width = 0;
    private int _screenWidth = TrincoClient.getInstance().globalWidth;
    private Font _font = Font.getDefaultFont();
    private String _text = "";
    private String _text2 = "";
    private Vector _vText = new Vector();
    private int _x = 0;
    private int _textColor = 0x000000;
    private int _bgColor = 0xffffff;
    private int _borderColor = 0xffffff;
    private int _selectedTextColor = 0xffff00;
    private int _selectedBgColor = 0x000000;
    private int _selectedBorderColor = 0x000000;
    private boolean isScrollerStarted = false;
    private int maxWidth = 0;

    private class ScrollerTimerTask extends TimerTask {

        private int stringWidth;
        private int direction;

        public ScrollerTimerTask(int stringWidth) {
            this.stringWidth = stringWidth;
        }

        public final void run() {
            if (isScrollerStarted) {
                if (stringWidth - _x <= _screenWidth - 13) {
                    direction = -1;
                }
                if (_x == 0) {
                    direction = 1;
                }
                _x += direction;
                repaint();
            } else {
                this.cancel();
            }
        }
    }

    public TrincoMenuItem(String label) {
        super(label);
        _width=_screenWidth;
    }

    public TrincoMenuItem(String label, String text) {
        super(label);
        this.setText(text);
        this._height=this._font.getHeight();
        _width=_screenWidth;
    }

    public TrincoMenuItem(String label, int lines) {
        super(label);
        this._height = this._font.getHeight()*lines;
        _width=_screenWidth;
    }

    public TrincoMenuItem(String label, String text, int lines) {
        super(label);
        this.setText(text);
        this._height = this._font.getHeight()*lines;
        _width=_screenWidth;
    }

    public TrincoMenuItem(String label, int lines, int widthPercent) {
        super(label);
        this._height = this._font.getHeight()*lines;
        _width=_screenWidth*widthPercent/100;
    }

    public TrincoMenuItem(String label, String text, int lines, int widthPercent) {
        super(label);
        this.setText(text);
        this._height = this._font.getHeight()*lines;
        _width=_screenWidth*widthPercent/100;
    }

    public TrincoMenuItem(int lines) {
        super("");
        this._height = this._font.getHeight()*lines;
        _width=_screenWidth;
    }

    public TrincoMenuItem(int lines, int widthPercent) {
        super("");
        _width=_screenWidth*widthPercent/100;
    }

    private void splitText() {
        this._vText.removeAllElements();
        int start = 0, stop = 0;
        String str = _text + " " + _text2;
        do {
            if (str.indexOf("\n", start) == -1) {
                stop = str.length();
            } else {
                stop = str.indexOf("\n", start);
            }
            this._vText.addElement(str.substring(start, stop));
            start = stop + 1;
        } while (start <= str.length());
    }

    protected int getMinContentWidth() {
        return _width;
    }

    protected int getMinContentHeight() {
        return _height;
    }

    protected int getPrefContentWidth(int height) {
        return _width;
    }

    protected int getPrefContentHeight(int width) {
        return _height;
    }

    protected void paint(Graphics g, int w, int h) {
        String str = _text + " " + _text2;

        //Фон
        if (this.isSelected) {
            g.setColor(this._selectedBgColor);
        } else {
            g.setColor(this._bgColor);
        }
        g.fillRect(0, 0, w, h);

        //Рамка
        if (this.isSelected) {
            g.setColor(this._selectedBorderColor);
        } else {
            g.setColor(this._borderColor);
        }
        g.drawRect(0, 0, w - 1, h - 1);

        //Текст
        if (this.isSelected) {
            g.setColor(this._selectedTextColor);
        } else {
            g.setColor(this._textColor);
        }

        Enumeration en = this._vText.elements();
        int currentY = 0;
        while (en.hasMoreElements()) {
            String out = en.nextElement().toString();
            this.maxWidth = this._font.stringWidth(out) > this.maxWidth ? this._font.stringWidth(out) : this.maxWidth;
            //System.out.println("MAXWIDTH OF '"+out+"' is "+this.maxWidth);
            //g.drawString(str, w / 2 - _font.stringWidth(str) / 2, 0, 0); //Текст по центру
            g.drawString(out, 3 - _x, currentY, 0); //Текст слева
            //g.drawString(str, w - _font.stringWidth(str), 0, 0); //Текст справа
            currentY += this._font.getHeight();
        }
    }

    public void setText(String text) {
        _text = text;
        this.splitText();
        repaint();
    }

    public String getText() {
        return _text;
    }

    public void setText2(String text2) {
        _text2 = text2;
        this.splitText();
        repaint();
    }

    public void setColors(int borderColor, int textColor, int bgColor, int selectedBorderColor, int selectedTextColor, int selectedBgColor) {
        if (borderColor >= 0) {
            this._borderColor = borderColor;
        }
        if (textColor >= 0) {
            this._textColor = textColor;
        }
        if (bgColor >= 0) {
            this._bgColor = bgColor;
        }

        if (selectedBorderColor >= 0) {
            this._selectedBorderColor = selectedBorderColor;
        }
        if (selectedTextColor >= 0) {
            this._selectedTextColor = selectedTextColor;
        }
        if (selectedBgColor >= 0) {
            this._selectedBgColor = selectedBgColor;
        }
        repaint();
    }

    public void setKey(String newKey) {
        this.key = newKey;
    }

    public String getKey() {
        return this.key;
    }

    protected final boolean traverse(int direction, int viewportWidth, int viewportHeight, int[] visRect_inOut) {
        isSelected = true;
        repaint();

        //Прокрутка строки
        //if (_font.stringWidth(_text + " " + _text2) > _screenWidth) {
        if (this.maxWidth >= _screenWidth) {
            Timer timer = new Timer();//Для прокрутки строки
            //ScrollerTimerTask stt = new ScrollerTimerTask(_font.stringWidth(_text + " " + _text2));
            ScrollerTimerTask stt = new ScrollerTimerTask(this.maxWidth);
            timer.schedule(stt, 1000, 50);
            isScrollerStarted = true;
        }
        return false;
    }

    protected final void traverseOut() {
        isSelected = false;
        isScrollerStarted = false;
        _x = 0;
        repaint();
    }
}

Спасибо!


Дополнение:
Пробовал на nokia 2330c - все отлично работает.

Это сообщение отредактировал(а) AleX83Xpert - 17.12.2009, 09:46
PM MAIL   Вверх
ivanovpv
Дата 17.12.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 10
Всего: 28



Цитата(AleX83Xpert @  17.12.2009,  09:06 Найти цитируемый пост)
Пишу приложение для телефонов. MIDP-1.0, CLDC-2.0. 

Парочка у вас странная: MIDP-1.0 + CLDC-2.0 - во первых CLDC 2.0 - такого не бывает, во вторых обычно используется пара MIDP-1.0+CLDC-1.0 (это так скать для древних телефонов) или MIDP 2.0+CLDC-1.1 (для современных телефонов)

В общем попробуйте перейти на MIDP 2.0 там работа с Item более продвинутая и возможно не будет того о чем вы пишете.


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
AleX83Xpert
Дата 17.12.2009, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 17.12.2009

Репутация: нет
Всего: нет



Цитата(ivanovpv @  17.12.2009,  09:27 Найти цитируемый пост)
Парочка у вас странная: MIDP-1.0 + CLDC-2.0

Ошибся. Конечно же MIDP-2.0 + CLDC-1.0
PM MAIL   Вверх
ivanovpv
Дата 17.12.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Варвар
**


Профиль
Группа: Участник
Сообщений: 639
Регистрация: 26.1.2005
Где: Москва

Репутация: 10
Всего: 28



Цитата(AleX83Xpert @  17.12.2009,  09:06 Найти цитируемый пост)
Пробовал на nokia 2330c - все отлично работает.


Соберите под платформу S40 (Nokia SDK S40) и напустите на телефоны SE - они все равно совместимы с S40 - должно заработать (по крайней мере SE K790 точно).


--------------------
Aut viam inveniam aut faciam
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.