Tabela custom item

Olá,

Preciso fazer uma tabela, no JME, mas meu código não está funcionando.
Quero passar o cabeçalho no contrutor e adicionar as linhas com as informações com o setLinha.
Se alguém puder ajudar agradeço!!!

package jmr.ui.window;

import java.util.Vector;

import javax.microedition.lcdui.*;

public class Table extends CustomItem {
   
   private static final int UPPER = 0;//superior
   private static final int IN = 1;//em
   private static final int LOWER = 2;//inferior
   private String [][] linha;
   private int coluna;
   private int largura_table ;
   private int largura ;
   private int altura ;
   private int location = UPPER;
   private int currentX = 0;
   private int currentY = 0;
 
   private Font fonte;
   private Font fonteCols;

   // Traversal stuff     
   // indicating support of horizontal traversal internal to the CustomItem
   boolean horz;

   // indicating support for vertical traversal internal to the CustomItem.
   boolean vert;

   public Table(String title, String [] sCabecalho) 
   {
       super(title); 
       
       coluna = sCabecalho.length;
       this.linha [0] = sCabecalho;
       fonte = Font.getFont( Font.FACE_MONOSPACE, Font.STYLE_PLAIN,(Font.SIZE_SMALL) )  ;
       fonteCols = Font.getFont(  Font.FACE_MONOSPACE, Font.STYLE_BOLD, (Font.SIZE_SMALL ))  ;
       largura = fonte.getHeight()  +  (fonteCols.getHeight() * coluna) ;
       altura = fonte.getHeight()+(fonteCols.getHeight()*linha.length);
       
       int interactionMode = getInteractionModes();
       horz = ((interactionMode & CustomItem.TRAVERSE_HORIZONTAL) != 0);
       vert = ((interactionMode & CustomItem.TRAVERSE_VERTICAL) != 0);
   }

   protected int getMinContentHeight() {
	   return fonte.getHeight();
   }

   protected int getMinContentWidth() {
       return (coluna * largura) + 1;
   }

   protected int getPrefContentHeight(int width) 
   {
       return (linha.length * altura) + 1;
   }

   protected int getPrefContentWidth(int height) 
   {
       return (linha.length * largura) + 1;
   }

   protected void paint(Graphics g, int w, int h) 
   {
       //Pinta a área do item de branco  
	   g.setColor(255, 255, 255);
       g.fillRect(0, 0, w-1, h-1);
       
       //Pinta o cabeçalho de cinza
       g.setColor(200,200, 200);
       g.fillRect(0, 0, w, fonte.getHeight());
       
       //Bordas e linhas verticais
       g.setColor(0, 0, 0);
       g.drawLine(0, fonte.getHeight(), w, fonte.getHeight());
       for (int i = 1; i < coluna; i++)
       {
    	   g.drawLine((w/coluna)*i, 0, (w/coluna)*i, h-1);
       }
       g.drawRect(0, 0, w-1, h-1);
       
       //Linhas horizontais
       g.setStrokeStyle(g.DOTTED);
       for (int i = 1; i < linha.length; i++)
       {
    	   g.drawLine(0, fonteCols.getHeight()+(fonte.getHeight()*(i)), w, fonteCols.getHeight() + (fonte.getHeight()*(i)));
       }
       
       //Cabeçalho
       g.setFont(fonteCols);
       for (int i = 1; i <= coluna; i++) 
       {
        	g.drawString (linha[0][i], ((w/coluna)/2 ) * i + ( w / coluna / 2 * (i - 1) ), fonteCols.getHeight(), Graphics.HCENTER|Graphics.BOTTOM);   
       } 
       
       //Desenha o restante da tabela
       g.setFont(fonte);
       for (int i = 1; i < linha.length; i++) 
       {
    	   g.setColor(0, 0, 0);
  
    	   for (int j = 0; j <= coluna; j++)
    	   {
    	   	   g.drawString(linha[i][j], ((w/coluna)/2)*j +
    	   	   (w/coluna/2*(j-1)), fonteCols.getHeight() +
    	   	   (fonte.getHeight()*(i+1)), Graphics.HCENTER|Graphics.BOTTOM);
    	   }         
       }
   }

   protected boolean traverse(int dir, int viewportWidth, int viewportHeight, int[] visRect_inout) 
   {
	   if (horz && vert) 
	   {
           switch (dir) 
           {
           case Canvas.DOWN://abaixo

               if (location == UPPER) {
                   location = IN;
               } else {
                   if (currentY < (linha.length - 1)) {
                       currentY++;
                       repaint(currentX * largura, (currentY - 1) * altura, largura, altura);
                       repaint(currentX * largura, currentY * altura, largura, altura);
                   } else {
                       location = LOWER;

                       return false;
                   }
               }

               break;

           case Canvas.UP://acima

               if (location == LOWER) 
               {
                   location = IN;
               } else {
                   if (currentY > 0) 
                   {
                       currentY--;
                       repaint(currentX * largura, (currentY + 1) * altura, largura, altura);
                       repaint(currentX * largura, currentY * altura, largura, altura);
                   } 
                   else 
                   {
                       location = UPPER;

                       return false;
                   }
               }

               break;

           case Canvas.LEFT://esquerdo

               if (currentX > 0) {
                   currentX--;
                   repaint((currentX + 1) * largura, currentY * altura, largura, altura);
                   repaint(currentX * largura, currentY * altura, largura, altura);
               }

               break;

           case Canvas.RIGHT://direito

               if (currentX < (coluna - 1)) {
                   currentX++;
                   repaint((currentX - 1) * largura, currentY * altura, largura, altura);
                   repaint(currentX * largura, currentY * altura, largura, altura);
               }
           }
       } else if (horz || vert) {
           switch (dir) {
           case Canvas.UP:
           case Canvas.LEFT:

               if (location == LOWER) {
                   location = IN;
               } else {
                   if (currentX > 0) {
                       currentX--;
                       repaint((currentX + 1) * largura, currentY * altura, largura, altura);
                       repaint(currentX * largura, currentY * altura, largura, altura);
                   } else if (currentY > 0) {
                       currentY--;
                       repaint(currentX * largura, (currentY + 1) * altura, largura, altura);
                       currentX = coluna - 1;
                       repaint(currentX * largura, currentY * altura, largura, altura);
                   } else {
                       location = UPPER;

                       return false;
                   }
               }

               break;

           case Canvas.DOWN:
           case Canvas.RIGHT:

               if (location == UPPER) {
                   location = IN;
               } else {
                   if (currentX < (coluna - 1)) {
                       currentX++;
                       repaint((currentX - 1) * largura, currentY * altura, largura, altura);
                       repaint(currentX * largura, currentY * altura, largura, altura);
                   } else if (currentY < (linha.length - 1)) {
                       currentY++;
                       repaint(currentX * largura, (currentY - 1) * altura, largura, altura);
                       currentX = 0;
                       repaint(currentX * largura, currentY * altura, largura, altura);
                   } else {
                       location = LOWER;

                       return false;
                   }
               }
           }
       } else {
           // In case of no Traversal at all: (horz|vert) == 0
       }

       visRect_inout[0] = currentX;
       visRect_inout[1] = currentY;
       visRect_inout[2] = largura;
       visRect_inout[3] = altura;

       return true;
   }
   
   public void setLinha(String [] text) 
   {
	   int l = linha.length;
	   linha[l+1] = text;
       repaint();
   }
}

Já tive bastate problemas com os forms padrões do JME, te aconselho a usar o polish caso o seu programa seja open source. Vale muito a pena, no começo vc vai sofrer um pouco com os css, mais depois vai se acustumar, dá uma olhada na parte dos componentes visuais dele:

http://www.j2mepolish.org/cms/leftsection/documentation/design/visual-guide.html

Realmente estou sofendo, rsrsrsrs.

Vou dá uma olhada no site

Obgda!

Oi,

Pelo que vi esta ferramente é paga.
Preciso de algo free.

[quote=irisvanda]Oi,

Pelo que vi esta ferramente é paga.
Preciso de algo free.[/quote]

Pois é…nem indiquei por conta disto. Muitos esquecem deste “pequeno” detalhe.

Bem, não sei se ajuda, mas o Netbeans traz um componente baseado em CustomItem para fazer tabela.

http://wiki.forum.nokia.com/index.php/Crie_tabelas_mais_flexíveis_com_o_Java_ME

Caso contrario tenta o LWUIT https://lwuit.dev.java.net/ que usa GNU (totalmente free), mas já vou dizendo: não chega aos pés do polish…

Caso contrario tenta o LWUIT https://lwuit.dev.java.net/ que usa GNU (totalmente free), mas já vou dizendo: não chega aos pés do polish…[/quote]

Também não vejo o LWUIT com bons olhos, afinal, esta licença GPL te obriga a liberar tua aplicação junto com o código-fonte.

Para ser realmente útil deveria ser LGPL. Não tem só eu que não gostou de ser GPL. Veja abaixo:
http://bluxte.net/blog/2008-05/23-45-12.html

A não ser que vc esteja fazendo algo que não é para ambiente corportativo e pode compartilhar o seu código-fonte com outros, ai eu não vejo problema. Agora para aplicações corportativas e outras, a LWUIT sob esta licença, não é uma alterativa.

Quem sabe daqui um tempo não repensem isto ? Por agora, nem vou atrás de estudar, pois não compensa. Já testei em celulares e gostei do que vi.

Agradeço a todos pelas opniões, mas estou precisando criar a tabela pelo custom item mesmo, pois não possui restrições referentes a distribuidção.
Encontrei um exemplo em um tutorial, mas não consegui fazer meu código funcionar.

Abraços

Se alguém conhecer algum livro que fale sobre o assunto, posta ai, ajudaria muito.

Abraços

Mude seu método para:

public void alteraLinha(String[] colunas, int linhaIndex) {  
     linha[linhaIndex] = colunas;
     invalidate();
}

Isso serve para alterar o conteúdo de uma determinada linha.

Se você quiser adicionar uma linha, aí o bicho pega. Seria algo como:

public void addLinha(String[] colunas) {  
     String[][] temp = linha;
     linha = new String[temp.length + 1][coluna];
     for (int i = 0; i &lt; temp.length; i++)
         linha[i] = temp[i];
     linha[linha.length - 1] = colunas;
     invalidate();
}

Acho que é por aí.

Obrigada a todos pela ajuda.
Para resolver o problema passei a utilizar um vetor e um array de strings, estou postando o código correto abaixo. Só não conclui o transverse. Como percebi que é díficil encontrar algo sobre custom item na internet, futuramente vou postar um documento com tudo que consegui aprender.

Abraços

package jmr.ui.window;

import java.util.Vector;

import javax.microedition.lcdui.*;

public class Table extends CustomItem 
{
	private Vector dados = new Vector () ;
	private String [] linha = null;
	private int nLinhas;
	private int nColunas;
	private int nLargura;
	private int nAltura;
	
	private Font fonte;
	private Font fontecol;
	
	private boolean horz;
	private boolean vert;
	
	private static final int UPPER = 0;//superior
	private static final int IN = 1;//em
	private static final int LOWER = 2;//inferior
	private int location = UPPER;
	private int currentX = 0;
	private int currentY = 0;
	
	public Table( String sTitulo, String [] sCabecalho ) 
	{
		super(sTitulo);
		
		dados.addElement( sCabecalho );
		linha = sCabecalho; 
		nColunas = linha.length;
		nLinhas = 1;
		
		fonte = Font.getFont( Font.FACE_MONOSPACE, Font.STYLE_PLAIN,(Font.SIZE_SMALL) )  ;
	    fontecol = Font.getFont(  Font.FACE_MONOSPACE, Font.STYLE_BOLD, (Font.SIZE_SMALL ))  ;  
		
	    nLargura = 320/nColunas ;
	    nAltura = (fontecol.getHeight() * nLinhas)+1;
	    
	    int interactionMode = getInteractionModes();
	    horz = ((interactionMode & CustomItem.TRAVERSE_HORIZONTAL) != 0);
	    vert = ((interactionMode & CustomItem.TRAVERSE_VERTICAL) != 0);
	}

	protected int getMinContentHeight() 
	{
		return fonte.getHeight();
	}

	protected int getMinContentWidth() 
	{
		return 240;
	}

	protected int getPrefContentHeight(int alt) 
	{
		return nAltura+1;
	}

	protected int getPrefContentWidth(int larg) 
	{
		
		return 320;
	}

	protected void paint(Graphics g, int larg, int alt) 
	{
		//Pinta toda a área de branco
		g.setColor(255, 255, 255);
		g.fillRect(0, 0, larg, alt);
		
		//Pinta o cabeçalho
		g.setColor(  189  ,   205  ,   225  )  ;   
		g.fillRect(  0  ,   0  , larg, fontecol.getHeight()+1)  ; 
		
		//Borda da tabela
		g.setColor(0, 0, 0);
		g.drawRect(0, 0, larg-1, alt);
		
		//Linhas horizontais
		for (int i = 1; i < nLinhas; i++)
		{
			if (i == 1)
			{
				g.drawLine(0, (fontecol.getHeight()+1)*i, larg, (fontecol.getHeight()+1)*i);
			}
			else
			{
				g.drawLine(0, (fonte.getHeight()+2)*i, larg, (fonte.getHeight()+2)*i);
			}
		}
		
		//Linhas verticais
		for (int i = 1; i < nColunas; i++)
		{
			g.drawLine(larg/nColunas*i, 0, larg/nColunas*i, alt);
		}
		
		//Adiciona dados
		for (int i = 0; i < dados.size(); i++)
		{
			linha = (String[]) dados.elementAt(i);
			for (int l = 0; l < nColunas; l++)
			{
                int oldClipX = g.getClipX();
                int oldClipY = g.getClipY();
                int oldClipWidth = g.getClipWidth();
                int oldClipHeight = g.getClipHeight();
                if ( i == 0 )
                {
                	//Cabeçalho
                	g.setClip((l * (larg/nColunas)) + 1, i * (fontecol.getHeight()+1), (larg/nColunas) - 1, (fontecol.getHeight()+1) - 1);
                    g.drawString(linha[l].toString(), (l * (larg/nColunas)) + 2, ((i + 1) * (fontecol.getHeight()+1)) - 2,
                        Graphics.BASELINE | Graphics.LEFT);

                    g.setClip(oldClipX, oldClipY, oldClipWidth, oldClipHeight);
                }
                else
                {
                	//Restante da tabela
                	g.setFont(fonte);
                	g.setClip((l * (larg/nColunas)) + 1, i * (fonte.getHeight()+1), (larg/nColunas) - 1, (fonte.getHeight()+1) - 1);
                    g.drawString(linha[l].toString(), (l * (larg/nColunas)) + 2, ((i + 1) * (fonte.getHeight()+1)) - 2,
                        Graphics.BASELINE | Graphics.LEFT);

                    g.setClip(oldClipX, oldClipY, oldClipWidth, oldClipHeight);
                }
			}
			
		}
	}
	
	protected boolean traverse(int dir, int viewportWidth, int viewportHeight, int[] visRect_inout) 
	   {
		   if (horz && vert) 
		   {
	           switch (dir) 
	           {
	           case Canvas.DOWN://abaixo

	               if (location == UPPER) {
	                   location = IN;
	               } else {
	                   if (currentY < (linha.length - 1)) {
	                       currentY++;
	                       repaint(currentX * nLargura, (currentY - 1) * nAltura, nLargura, nAltura);
	                       repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	                   } else {
	                       location = LOWER;

	                       return false;
	                   }
	               }

	               break;

	           case Canvas.UP://acima

	               if (location == LOWER) 
	               {
	                   location = IN;
	               } else {
	                   if (currentY > 0) 
	                   {
	                       currentY--;
	                       repaint(currentX * nLargura, (currentY + 1) * nAltura, nLargura, nAltura);
	                       repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	                   } 
	                   else 
	                   {
	                       location = UPPER;

	                       return false;
	                   }
	               }

	               break;

	           case Canvas.LEFT://esquerdo

	               if (currentX > 0) {
	                   currentX--;
	                   repaint((currentX + 1) * nLargura, currentY * nAltura, nLargura, nAltura);
	                   repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	               }

	               break;

	           case Canvas.RIGHT://direito

	               if (currentX < (nColunas - 1)) {
	                   currentX++;
	                   repaint((currentX - 1) * nLargura, currentY * nAltura, nLargura, nAltura);
	                   repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	               }
	           }
	       } else if (horz || vert) {
	           switch (dir) {
	           case Canvas.UP:
	           case Canvas.LEFT:

	               if (location == LOWER) {
	                   location = IN;
	               } else {
	                   if (currentX > 0) {
	                       currentX--;
	                       repaint((currentX + 1) * nLargura, currentY * nAltura, nLargura, nAltura);
	                       repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	                   } else if (currentY > 0) {
	                       currentY--;
	                       repaint(currentX * nLargura, (currentY + 1) * nAltura, nLargura, nAltura);
	                       currentX = nColunas - 1;
	                       repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	                   } else {
	                       location = UPPER;

	                       return false;
	                   }
	               }

	               break;

	           case Canvas.DOWN:
	           case Canvas.RIGHT:

	               if (location == UPPER) {
	                   location = IN;
	               } else {
	                   if (currentX < (nColunas - 1)) {
	                       currentX++;
	                       repaint((currentX - 1) * nLargura, currentY * nAltura, nLargura, nAltura);
	                       repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	                   } else if (currentY < (linha.length - 1)) {
	                       currentY++;
	                       repaint(currentX * nLargura, (currentY - 1) * nAltura, nLargura, nAltura);
	                       currentX = 0;
	                       repaint(currentX * nLargura, currentY * nAltura, nLargura, nAltura);
	                   } else {
	                       location = LOWER;

	                       return false;
	                   }
	               }
	           }
	       } else {
	           // In case of no Traversal at all: (horz|vert) == 0
	       }

	       visRect_inout[0] = currentX;
	       visRect_inout[1] = currentY;
	       visRect_inout[2] = nLargura;
	       visRect_inout[3] = nAltura;

	       return true;
	   }
	
    public void setLinha (String [] dado)
    {
    	nLinhas+=1;
    	nAltura = (fontecol.getHeight() * nLinhas)+1;
    	dados.addElement(dado);
    	repaint();
    }
}

No site da SUN tem algumas coisas legais sobre CustomItem. Tem inclusive, um artigo sobre CustomItem que aborda muitas coisas, inclusive o método travese.

O link para o artigo da SUN é esse aqui: http://developers.sun.com/mobility/midp/articles/customitems/index.html