Пишу приложение для телефонов. 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
|