Problema com Canvas

Pessoal,

fiz uma tela em canvas para meu aplicativo, testei no palm e funcina perfeitamente, mas instalei esse aplicativo em outro aparelho, um nokia 5800, mas nesse aparelho essa tela não funciona corretamente, pois ao clicar em um botão da classe dessa tela ela deve ser redesenhada, mas isso só acontece quando eu saio dela e abro novamente.

Alguem sabe por que isso acontece? Alguem sabe corrigir?

obs. lembrando que num aparelho ta normal e só acontece isso no outro

aguardo sugestões!
obrigado

Posta o código aí.

Tem algo errado aqui?

public void onButtomTouch(ButtomImage buttom){ if (buttom == img01) repaint(); }

[code] protected void paint(Graphics g){
// Re-define a cor que será usada no label dos botões
int corPreto = 0x00000000;

    // Re-define a fonte que será usada no label dos botões
    Font fonteBotao = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);

    // Re-define a imagem que será usada nos botões
    Image image01 = getImg01();

    // Re-define botões e posicionamento
    img01 = new ButtomImage(212, 18, image01, this, "", corPreto, fonteBotao);

    // Pinta a tela
    g.setColor(0x00ffffff);
    g.fillRect(0, 0, getWidth(), getHeight());
    g.setColor(0x00000000);
    g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));

    img01.paint(g);
}[/code]

Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.

[quote=j0nny]Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.[/quote]

sim, como eu disse a tela só é mostrada quando eu saio e entro na classe novamente, mas a ideia é recarregar dentro da propria classe
isso ja funciona no palm da maneira que postei, só nesse outro aparelho que não

o que vc fez para resolver na sua situação?

[quote=vfmartins][quote=j0nny]Uma dica, não instancie objetos dentro do paint.
Outra, vc está repintando tbm a tela onde está seu botão?
Isso já ocorreu cmg tbm.[/quote]

sim, como eu disse a tela só é mostrada quando eu saio e entro na classe novamente, mas a ideia é recarregar dentro da propria classe
isso ja funciona no palm da maneira que postei, só nesse outro aparelho que não

o que vc fez para resolver na sua situação?[/quote]

Ok, tente chamar o repaint do seu botão quando vc da um repaint na sua tela, deve funcionar.

não entendi, o meu código é só isso, tudo junto, o que mudaria se chamar separado?

Tente assim…

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01) {
            button.repaint();
            repaint();
        }
}

Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops:

[quote=j0nny]Tente assim…

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01) {
            button.repaint();
            repaint();
        }
}

Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops: [/quote]

aqui deu erro no buttom.repaint(); deu cannot find symbol

viu, uma coisa que eu reparei testando no aparelho é que ele executa sim ao tocar, mas ele só pinta a tela quando eu executo alguma outra ação qualquer (mesmo que seja algo do aparelho que nem faça parte do aplicativo)

será que é algum bug do aparelho que pinta a tela com atraso ou será que estou fazendo algo errado?

[quote=vfmartins][quote=j0nny]Tente assim…

public void onButtomTouch(ButtomImage buttom){
        if (buttom == img01) {
            button.repaint();
            repaint();
        }
}

Não sei se é a melhor solução, mas assim que resolvi meu problema momentaneamente :oops: [/quote]

aqui deu erro no buttom.repaint(); deu cannot find symbol

viu, uma coisa que eu reparei testando no aparelho é que ele executa sim ao tocar, mas ele só pinta a tela quando eu executo alguma outra ação qualquer (mesmo que seja algo do aparelho que nem faça parte do aplicativo)

será que é algum bug do aparelho que pinta a tela com atraso ou será que estou fazendo algo errado?

[/quote]

Então melhor, crie um método repinta() no seu botão que chama o repaint() e teste. Claro que é meio POG :oops: , mas teste para ver se é isso msm.

eu tentei isso, mas nem assim deu certo
eu verifiquei que isso também acontece quando uma tela canvas de uma classe chama uma outra tela canvas de outra classe
o que pode ser ein?

É estranho, pq aqui faço o seguinte.
No meu form canvas, no pointerPressed(), verifico se a área de algum dos comopnentes foi tocada, se foi, então repasso o pointerPressed() para o componente, então ele se encarrega de fazer a ação que quiser e dar um repaint() nele.
No caso seria mais ou menos assim.

//no form
protected void pointerPressed(int x, int y) {
   //faço um laço percorrendo os componentes e chamando o isTouched() que nm vc
   if(componente.isTouched(int x, int y) {
      componente.pointerPressed(int x, int y);
      repaint();
   }
}

//no componente
protected void pointerPressed(int x, int y) {
   //faço a ação desejada conforme as coordenadas e repinto
   repaint();
}

cara, mesma coisa!

o teu código tbm funciona, mas não da maneira que eu preciso
das duas formas a tela só é pintada após alguma outra ação no aparelho
e agora?? alguém sabe o que eu faço para pintar a tela no ato?

continuo aguardado

Cara, nem tinha me tocado, mas observe, cada vez que vc chamar o repaint(), um novo botao será criado, é isso mesmo que vc quer?
Creio que assim não pode funcionar mesmo.

[quote=j0nny]Cara, nem tinha me tocado, mas observe, cada vez que vc chamar o repaint(), um novo botao será criado, é isso mesmo que vc quer?
Creio que assim não pode funcionar mesmo.[/quote]

então, a intenção é que ao clicar nesse botão o usuário tenha a sensação que ele mudou de cor, mas na verdade pinta novamente a tela e no lugar daquela imagem vai uma de outra cor (eu percebi que ele faz isso, mas com atraso, pois quando eu clico a primeira vez visualmente não faz nada, mas quando eu clico a segunda eu vejo ele executar a primeira ação, entende?)

vc tem alguma sugestão??

alguém tem??

lembrando que no outro aparelho ja funciona (será que é erro mesmo ou imcompatibilidade)

Cara, então use algo assim.
Tenha uma variavel de controle no seu botao, por exemplo, boolean estaClicado = false.
E quando ele for tocado, faça o seguinte, estaClicado = true.

No paint() do botao, faça

if(estaClicado) {
   //pinta na cor e no jeito que vc quiser
}
else {
   //pinte na forma comum
}

//ou ainda
int corBotao;
if(estaClicado)
   corBotao = 0x00ffffff;
else
   corBotao = 0x00000000;

//pinte seu botao com a cor que está em corBotao

Ah, e não esqueça de instanciar seu botao fora do paint() :thumbup:

ixi… mesma coisa…

ele executa sabe, mas a tela só carrega na próxima ação

será incompatibildade?

Tirou a instanciação de dentro do paint()?
Ele executa normal no emmulador?
Qq coisa, posta aí como vc fez.

[quote=j0nny]Tirou a instanciação de dentro do paint()?
Ele executa normal no emmulador?
Qq coisa, posta aí como vc fez.[/quote]

tirei, testei todas as formas, mas sempre da esse atraso
no emulador funciona, mas pelo command, não consigo testar o touch
mas no palm funciona de todas as maneiras

segue meu código (que funciona no palm e no nokia tfunciona com atraso)

protected void pointerPressed(int x, int y){ if (img01.isTouched(x, y)) repaint(); }

protected void paint(Graphics g){ repinta(); }

[code]public void repinta(){
// Re-define a cor que será usada no label dos botões
int corPreto = 0x00000000;

// Re-define a fonte que será usada no label dos botões   
Font fonteBotao = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL);   

// Re-define a imagem que será usada nos botões   
Image image01 = getImg01();   

// Re-define botões e posicionamento   
img01 = new ButtomImage(212, 18, image01, this, "", corPreto, fonteBotao);   

// Pinta a tela   
g.setColor(0x00ffffff);   
g.fillRect(0, 0, getWidth(), getHeight());   
g.setColor(0x00000000);   
g.setFont(Font.getFont(Font.FACE_SYSTEM, Font.STYLE_PLAIN, Font.SIZE_SMALL));   

img01.paint(g);

}[/code]