Mais uma dúvida com JTable

7 respostas
B

Eu ja procurei pela internet mas não acho o que eu preciso.
quando eu acho é extremamente complexo.

o que eu preciso saber é:

em uma tabela como eu posso trabalhar com celulas separadas?

como eu posso pegar uma célula especifica e trocar a cor dela?

alguém teria um código de exemplo simples para eu entender o funcionamento?
obrigado

7 Respostas

B

alguem?
:frowning:

B

vou para faculdade agora. Mais de noite eu entro, espero que alguém possa me ajudar.
abraços

lina

Oi,

Vai depender da funcionalidade que você quer "acoplar" a sua célula.

A principio, você precisaria criar uma classe ou uma inner-class que implemente um TableCellRenderer. A partir deste ponto, pode-se usar uma determinada célula para este TableCellRender.

Exemplo:

/**
Inner-class para controle das células.
*/
class Colorir extends JLabel implements TableCellRenderer{
  public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column){
    
     if(Integer.parseInt(value.toString()) < 20){
       setForeground(Color.BLUE);	
     }
     else{
       setForeground(Color.BLACK);		
     }
     
     setText(value.toString());
     	
     return this;   	
  }

// Aplicando a coluna 1.
TableCellRenderer tcr = new Colorir();
TableColumn column = tabela.getColumnModel().getColumn(1);
column.setCellRenderer(tcr);

No exemplo acima, estou colorindo de azul a coluna 1 caso a mesma tenha um texto com tamanho menor do que 20.

Tchauzin!

B
lina:
Oi,

Vai depender da funcionalidade que você quer "acoplar" a sua célula.

A principio, você precisaria criar uma classe ou uma inner-class que implemente um TableCellRenderer. A partir deste ponto, pode-se usar uma determinada célula para este TableCellRender.

Exemplo:

/**
Inner-class para controle das células.
*/
class Colorir extends JLabel implements TableCellRenderer{
  public Component getTableCellRendererComponent(
     JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int column){
    
     if(Integer.parseInt(value.toString()) < 20){
       setForeground(Color.BLUE);	
     }
     else{
       setForeground(Color.BLACK);		
     }
     
     setText(value.toString());
     	
     return this;   	
  }

// Aplicando a coluna 1.
TableCellRenderer tcr = new Colorir();
TableColumn column = tabela.getColumnModel().getColumn(1);
column.setCellRenderer(tcr);

No exemplo acima, estou colorindo de azul a coluna 1 caso a mesma tenha um texto com tamanho menor do que 20.

Tchauzin!

finalmente vejo uma luz no fim do túnel.
realmente é bem complicado mexer com JTable, mas irei estudar esse código que você me passou.

muito obrigado, volto a postar

B

achei um código que consegui entender bastante coisa.

Classe Principal

import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.table.TableCellRenderer;
import javax.swing.JFrame;
import javax.swing.JTable;

public class TableCellExample 
{	
	public static void main( String[] args ) 
	{
		JTable table = new JTable( new ExampleTableModel() ); 
		TableCellRenderer	renderer = new CustomTableCellRenderer();

		try
		{
			table.setDefaultRenderer( Class.forName( "java.lang.Integer" ), renderer );
		}
		catch( ClassNotFoundException ex )
		{	
			System.exit( 0 );
		}

		JFrame frame = new JFrame();
		frame.addWindowListener( 
			new WindowAdapter() 
			{
				public void windowClosing(WindowEvent e) 
				{
					System.exit(0);
				}
			}
		);

		frame.getContentPane().add( table );
		frame.pack();
		frame.setVisible( true );
	
	}
}
import javax.swing.table.AbstractTableModel;

public class ExampleTableModel extends AbstractTableModel
{
	private final String[] columnNames = { "Month", "Income" };
		
	final Object[][] data = {
		{"Janeiro",   new Integer(150) },
		{"Fevereiro",  new Integer(500) },
		{"Março",     new Integer(54)  },
		{"Abril",     new Integer(-50) },
		{"Maio",       new Integer(52)  },
		{"Junho",      new Integer(74)  },
		{"Julho",      new Integer(-25) },
		{"Agosto",    new Integer(62)  },
		{"Setembro", new Integer(15)  },
		{"Outubro",   new Integer(-5)  },
		{"Novembro",  new Integer(5)   },
		{"Dezembro",  new Integer(59)  }
	};

public ExampleTableModel() {}
public Class getColumnClass( int column ) 
{
	return getValueAt(0, column).getClass();
}
public int getColumnCount() 
{
	return columnNames.length;
}
public String getColumnName( int column ) 
{
	return columnNames[column];
}
public int getRowCount() 
{
	return data.length;
}
public Object getValueAt( int row, int column ) 
{
	return data[row][column];
}
}
import java.awt.Component;
import java.awt.Color;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;


public class CustomTableCellRenderer extends DefaultTableCellRenderer 
{
	public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) 
	{
													 
		Component cell = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

		if( value instanceof Integer )
		{
			Integer amount = (Integer) value; 
	   		if( amount.intValue() < 0 )
	   		{
	   			cell.setBackground( Color.red );
	   			// you can also customize the Font and Foreground this way
	   			// cell.setForeground();
	   			// cell.setFont();
	   		}
	   		else
	   		{	
				cell.setBackground( Color.white );
	   		}
		}
	
		return cell;

	}  
}

como eu tenho os Meses, eu nao gostaria de mudar a cor quando valor = tanto.

e sim quando por exemplo, mudar a cor do o dia 7 de Setembro (Feriado = Verde), e 10 e 11 (Fim de semana = Vermelho)

alguem?? :D

B

acredito que mais de noite as pessoas podem ter a resposta.

mais de noite ou amanha de manhã volto a entrar aqui para visualizar.

obrigado desde já.

lina

Oi,

A resposta não. Ideias e dicas sim.

Você irá preencher essa célula em tempo de execução ou a mesma já será apresentada preenchida? Utilize a classe Date ou algo semelhante para realizar suas consistências.

Tchauzin!

Criado 5 de setembro de 2011
Ultima resposta 6 de set. de 2011
Respostas 7
Participantes 2