Amigos,
Criei este customitem que serve para buscar um codigo da cidade em arquivos por streams mas em alguns celulares fica muito lento e em outros a tela trava e não navega.
Abaixo meu código. me perdoem pois estou aprendendo customitem agora.
import javax.microedition.lcdui.CustomItem;
import javax.microedition.lcdui.Font;
import javax.microedition.lcdui.Graphics;
import java.util.Vector;
import javax.microedition.lcdui.Canvas;
import java.io.InputStreamReader;
public class KnCiCidadesBox extends CustomItem{
/**Largura do campo*/
private int largura;
/**Altura do campo*/
private int altura;
private Font fonte;
/**Valor do código*/
private String vlCodigo;
/**Valor do campo estado*/
private String vlEstado;
/**Valor do campo cidade
* Tamanho Max 27
**/
private String vlCidade;
/**Posicao selecionada*/
private int posSelecao;
/**Estado selecionado*/
private int posEstado;
/**Cidade selecionado*/
private int posCidade;
/**Vetor de Estados*/
private Vector listaestados;
/**Vetor de Cidades*/
private Vector listacidades;
/**Vetor de Cidades*/
private Vector listacodcidades;
/**Estado Selecionado*/
private String valorEstado;
public KnCiCidadesBox (String Titulo, int _largura){
super(Titulo);
super.setLayout (CustomItem.LAYOUT_EXPAND);
setLayout (CustomItem.LAYOUT_EXPAND);
fonte = Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_PLAIN,Font.SIZE_MEDIUM);
largura = _largura;
altura = (fonte.getHeight () * 3);
vlCodigo = "";
vlEstado = "UF";
vlCidade = "CIDADE";
posSelecao = -1;
posEstado = 0;
posCidade = 0;
listaestados = new Vector();
listacidades = new Vector();
listacodcidades = new Vector();
valorEstado = "";
new Thread(){
public void run(){
carregarEstados();
}
}.start();
repaint ();
}
/**Metodo usado pela KVM*/
protected int getMinContentHeight() {return altura;}
/**Metodo usado pela KVM*/
protected int getMinContentWidth() {return largura;}
/**Metodo usado pela KVM*/
protected int getPrefContentHeight(int _i) {return altura;}
/**Metodo usado pela KVM*/
protected int getPrefContentWidth(int _i) {return largura;}
/**Metodo usado pela KVM*/
protected void keyPressed(int _keyCode){
if (vlCidade.length ()>=7){
if (vlCidade.substring (0,7).equals ("AGUARDE"))
return;
}
if (vlCidade.length ()>=8){
if (vlCidade.substring (0,8).equals ("BUSCANDO"))
return;
}
if (posSelecao == 0){
if (_keyCode == Canvas.FIRE){
new Thread(){
public void run(){
buscaCidade ();
}
}.start();
}else if ((_keyCode == Canvas.KEY_STAR)
|| (_keyCode == -8)
|| (_keyCode == 8)){
int tamanho = vlCodigo.length ();
if (tamanho>1){
tamanho --;
if ((tamanho == 3)
|| (tamanho == 6)){
tamanho --;
}
vlCodigo = vlCodigo.substring (0,tamanho);
}else{
vlCodigo = "";
}
}else if (vlCodigo.length ()<=6){
if (_keyCode == Canvas.KEY_NUM0){
vlCodigo += "0";
}else if (_keyCode == Canvas.KEY_NUM1){
vlCodigo += "1";
}else if (_keyCode == Canvas.KEY_NUM2){
vlCodigo += "2";
}else if (_keyCode == Canvas.KEY_NUM3){
vlCodigo += "3";
}else if (_keyCode == Canvas.KEY_NUM4){
vlCodigo += "4";
}else if (_keyCode == Canvas.KEY_NUM5){
vlCodigo += "5";
}else if (_keyCode == Canvas.KEY_NUM6){
vlCodigo += "6";
}else if (_keyCode == Canvas.KEY_NUM7){
vlCodigo += "7";
}else if (_keyCode == Canvas.KEY_NUM8){
vlCodigo += "8";
}else if (_keyCode == Canvas.KEY_NUM9){
vlCodigo += "9";
}
}
vlEstado = "UF";
vlCidade = "CIDADE";
invalidate ();
repaint ();
}
}
/**Metodo usado pela KVM*/
protected boolean traverse(int _dir, int _viewportWidth, int _viewportHeight, int[] _visRect_inout){
if (vlCidade.length ()>=7)
if (vlCidade.substring (0,7).equals ("AGUARDE"))
return false;
else if (vlCidade.length ()>=8)
if (vlCidade.substring (0,8).equals ("BUSCANDO"))
return false;
if (_dir == Canvas.UP){
return posSelecao (-1);
}else if (_dir == Canvas.DOWN){
return posSelecao (1);
}else{
if (_dir == Canvas.LEFT){
if (posSelecao == 1){
posEstado (-1);
}else if (posSelecao == 2){
posCidade(-1);
}
}else if (_dir == Canvas.RIGHT){
if (posSelecao == 1){
posEstado (1);
}else if (posSelecao == 2){
posCidade(1);
}
}
return true;
}
}
/**Metodo usado pela KVM*/
protected void paint(Graphics _tela, int _largura, int _altura) {
_tela.setFont (fonte);
_tela.setColor (255,255,255);
_tela.fillRect (0,0,largura,altura);
desenhaCampoCodigo(_tela);
desenhaCampoEstado(_tela);
desenhaCampoCidade(_tela);
//_tela.drawLine ((largura/2),0,(largura/2),(altura/2));
//_tela.drawLine (0,(altura/2),(largura-9) ,(altura/2));
//_tela.drawRect (0,0,(largura-9),(altura-1));
}
private void desenhaCampoCodigo(Graphics _tela){
int alt = fonte.getHeight ();
int y = (altura/4) - (alt/2);
int lar = ((largura/2)-20);
int x = ((largura/4)-(lar/2));
_tela.setColor (0,0,0);
//Desenha Texto
if (!vlCodigo.equals ("")){
while (_tela.getFont ().stringWidth (vlCodigo)>lar){
vlCodigo = vlCodigo.substring (0,vlCodigo.length ()-2);
}
_tela.drawString (vlCodigo, (x + ((lar/2)-(fonte.stringWidth (vlCodigo)/2))),y, Graphics.TOP|Graphics.LEFT );
}
//Desenha Borda
_tela.drawRect (x,y,lar,alt);
//Desenha Seleção
if (posSelecao == 0)
_tela.drawRect (x-2,y-2,lar+4,alt+4);
}
private void desenhaCampoEstado(Graphics _tela){
int alt = fonte.getHeight ();
int y = ((altura/4) - (alt/2));
int lar = ((largura/2)-40);
int x = (((largura-9)/2) + ((largura/4)-(lar/2)));
_tela.setColor (0,0,0);
if ((vlEstado.equals ("UF"))
|| (vlEstado.equals ("--")))
_tela.setColor (0,0,255);
//Desenha Texto
if (!vlEstado.equals ("")){
while (_tela.getFont ().stringWidth (vlEstado)>lar){
vlEstado = vlEstado.substring (0,vlEstado.length ()-2);
}
_tela.drawString (vlEstado, (x + ((lar/2)-(fonte.stringWidth (vlEstado)/2))),y, Graphics.TOP|Graphics.LEFT );
}
_tela.setColor (0,0,0);
//Desenha Borda
_tela.drawRect (x,y,lar,alt);
//Desenha Seleção
if (posSelecao == 1)
_tela.drawRect (x-2,y-2,lar+4,alt+4);
//Seta de Voltar
_tela.fillTriangle ( (x - 10), (y + (alt/2)),
(x - 3) ,y,
(x - 3) ,(y + alt));
//Seta de Avançar
_tela.fillTriangle ( ((x + lar) + 10), (y + (alt/2)),
((x + lar) + 4) ,y,
((x + lar) + 4) ,(y + alt));
}
private void desenhaCampoCidade(Graphics _tela){
int alt = fonte.getHeight ();
int y = (((altura-1)/2) + ((altura/4) - (alt/2)));
int lar = largura-40;
int x = (((largura-9)/2)-(lar/2));
_tela.setColor (0,0,0);
try{
if (vlCidade.equals ("CIDADE"))
_tela.setColor (0,0,255);
else if (vlCidade.length ()>=7)
if (vlCidade.substring (0,7).equals ("AGUARDE"))
_tela.setColor (0,0,255);
else if (vlCidade.length ()>=8)
if (vlCidade.substring (0,8).equals ("BUSCANDO"))
_tela.setColor (0,0,255);
else if (vlCidade.length()>=15)
if (vlCidade.substring (0,15).equals ("NÃO ENCONTRADO!"))
_tela.setColor (0,0,255);
}catch (Exception eC){
eC.printStackTrace ();
}
//Desenha Texto
if (!vlCidade.equals ("")){
int comprimento;
do{
comprimento = _tela.getFont().stringWidth (vlCidade);
if (comprimento>=lar){
if (_tela.getFont().getSize () == Font.SIZE_SMALL){
vlCidade = vlCidade.substring (0,vlCidade.length ()-2);
vlCidade += ".";
}else {
_tela.setFont (Font.getFont(Font.FACE_MONOSPACE, Font.STYLE_PLAIN,Font.SIZE_SMALL));
}
}
}while (comprimento >= lar);
_tela.drawString (vlCidade,
( (x + (lar/2)) - (_tela.getFont ().stringWidth (vlCidade)/2)),
(((altura-1)/2) + ((altura/4) - (_tela.getFont ().getHeight ()/2))),
Graphics.TOP|Graphics.LEFT );
_tela.setFont (fonte);
}
_tela.setColor (0,0,0);
//Desenha Borda
_tela.drawRect (x,y,lar,alt);
//Desenha Seleção
if (posSelecao == 2)
_tela.drawRect (x-2,y-2,lar+4,alt+4);
//Seta de Voltar
_tela.fillTriangle ( (x - 10), (y + (alt/2)),
(x - 3) ,y,
(x - 3) ,(y + alt));
//Seta de Avançar
_tela.fillTriangle ( ((x + lar) + 10), (y + (alt/2)),
((x + lar) + 4) ,y,
((x + lar) + 4) ,(y + alt));
}
private boolean posSelecao(int _valor){
posSelecao += _valor;
if ((posSelecao == 1)
&& (vlCodigo.length ()>0)
&& (vlEstado.equals ("UF"))){
new Thread(){
public void run(){
buscaCidade ();
}
}.start();
return false;
}else if ((posSelecao == 2)
&& (!valorEstado.equals (vlEstado)) && (!vlEstado.equals ("UF"))){
new Thread(){
public void run(){
carregarCidade (true);
}
}.start();
return true;
}else {
if (posSelecao < 0){
return false;
}else if (posSelecao > 2){
return false;
}else {
repaint ();
return true;
}
}
}
private void posEstado(int _valor){
if (listaestados.size () > 0){
posEstado += _valor;
if (posEstado >= listaestados.size ()){
posEstado = 0;
}
if (posEstado < 0){
posEstado = listaestados.size ()-1;
}
vlEstado = (String) listaestados.elementAt (posEstado);
vlCodigo = "";
vlCidade = "CIDADE";
valorEstado = "";
repaint ();
}
}
private void posCidade(int _valor){
if (listacidades.size () > 0){
posCidade += _valor;
if (posCidade >= listacidades.size ()){
posCidade = 0;
}
if (posCidade < 0){
posCidade = listacidades.size ()-1;
}
vlCidade = (String) listacidades.elementAt (posCidade);
vlCodigo = (String) listacodcidades.elementAt (posCidade);
repaint ();
}
}
private void carregarEstados(){
vlEstado = "Aguarde...";
repaint ();
listaestados = new Vector();
String Texto = "";
InputStreamReader iSR = null;
try{
iSR = new InputStreamReader(getClass().getResourceAsStream("/KnCiCidadesBox/Estados.kccb"));
int ch;
while((ch = iSR.read())>-1){
if (ch == 34){
if (!Texto.trim ().equals ("")){
listaestados.addElement (Texto);
Texto = "";
}
}else{
if ((ch != 13) && (ch!=10))
Texto += (char)ch;
}
}
vlEstado = "UF";
}catch(Exception e){
vlEstado = "N/D";
listaestados = new Vector();
e.printStackTrace ();
}
repaint ();
}
private void carregarCidade(boolean _exibe){
if (_exibe){
vlCidade = "AGUARDE...";
repaint ();
}
listacidades = new Vector();
listacodcidades = new Vector();
String Codigo = "";
String Texto = "";
InputStreamReader iSR = null;
try{
iSR = new InputStreamReader(getClass().getResourceAsStream("/KnCiCidadesBox/" + String.valueOf (listaestados.elementAt (posEstado)) +".kccb"));
int ch;
while((ch = iSR.read())>-1){
if (ch == 34){
if ((!Texto.trim ().equals (""))
&& (!Texto.trim ().equals (";"))) {
if (Codigo.equals ("")){
while (Texto.charAt (Texto.length ()-1) == '0')
Texto = Texto.substring (0,Texto.length ()-1);
Codigo = Texto;
}else{
listacidades.addElement (Texto);
listacodcidades.addElement (Codigo);
Codigo = "";
}
Texto = "";
}
}else{
if ((ch != 13) && (ch!=10) && (ch!=44) && (ch!=59))
Texto += (char)ch;
}
}
if (_exibe){
vlCidade = (String)listacidades.elementAt (0);
vlCodigo = (String) listacodcidades.elementAt (0);
valorEstado = vlEstado;
}
}catch(Exception e){
if (_exibe){
vlCidade = "N/D";
}
listacidades = new Vector();
listacodcidades = new Vector();
e.printStackTrace ();
}
if (_exibe){
repaint ();
}
}
private static String ajustaTamanho(String _texto, int _tamanho){
while(_texto.length()<_tamanho){
_texto += " ";
}
if(_texto.length()>_tamanho){
_texto = _texto.substring(0, _tamanho);
}
return _texto;
}
private void buscaCidade(){
try{
int Cont = 0;
vlEstado = "--";
vlCidade = "BUSCANDO";
posEstado = 0;
int tCod = -1;
int tvlCodigo = Integer.parseInt (vlCodigo);
while ((posEstado < listaestados.size ())
&& (vlCidade.substring(0,8).equals ("BUSCANDO"))){
if (vlCidade.trim().length ()<11){
vlCidade = vlCidade.trim() + ".";
}else{
vlCidade = "BUSCANDO";
}
vlCidade = ajustaTamanho (vlCidade,11);
repaint ();
posCidade = 0;
carregarCidade (false);
while ((posCidade < listacodcidades.size ())
&& (vlCidade.substring(0,8).equals ("BUSCANDO"))){
tCod = Integer.parseInt ((String)listacodcidades.elementAt (posCidade));
if (tCod == tvlCodigo){
vlCidade = ajustaTamanho ((String) listacidades.elementAt (posCidade),8);
vlEstado = (String) listaestados.elementAt (posEstado);
valorEstado = vlEstado;
}
posCidade++;
}
posEstado++;
}
}catch (Exception e){
BuscanaoEncontrada ();
e.printStackTrace ();
}
if (vlCidade.substring(0,8).equals ("BUSCANDO")){
BuscanaoEncontrada ();
}
repaint ();
}
private void BuscanaoEncontrada(){
vlCodigo = "";
vlEstado = "--";
vlCidade = "NÃO ENCONTRADO!";
posEstado = 0;
posCidade = 0;
repaint ();
try{
Thread.sleep (2000);
}catch (Exception e){
e.printStackTrace ();
}
vlEstado = "UF";
vlCidade = "CIDADE";
}
protected void pointerPressed(int _x, int _y){
int alt = fonte.getHeight ();
int y = ((altura/4) - (alt/2));
int lar = ((largura/2)-40);
int x = (((largura-9)/2) + ((largura/4)-(lar/2)));
if ((_x > (x-10)) && (_x < x) && (_y > (y - (alt/2))) && (_y < (y + alt))) {
posEstado (-1);
}else if ((_x > ((x + lar)-10)) && (_x > (x + lar)) && (_y >(y - (alt/2))) && (_y < (y + alt))){
posEstado (1);
}
alt = fonte.getHeight ();
y = (((altura-1)/2) + ((altura/4) - (alt/2)));
lar = largura-40;
x = (((largura-9)/2)-(lar/2));
if ((_x > (x-10)) && (_x < x) && (_y > (y - (alt/2))) && (_y < (y + alt))) {
if ((!valorEstado.equals (vlEstado)) && (!vlEstado.equals ("UF"))){
new Thread(){
public void run(){
carregarCidade (true);
}
}.start();
}
posCidade (-1);
}else if ((_x > ((x + lar)-10)) && (_x > (x + lar)) && (_y >(y - (alt/2))) && (_y < (y + alt))){
if ((!valorEstado.equals (vlEstado)) && (!vlEstado.equals ("UF"))){
new Thread(){
public void run(){
carregarCidade (true);
}
}.start();
}
posCidade (1);
}
}
}
Agradeço a atenção.