Botões diferentes em uma mesma coluna do Jtable

Bom dia Pessoal,

Estou com um pequeno probleminha que não consigo resolver.

Como posso fazer para que dependendo do valor de uma coluna da Jtable a imagem do botão seja diferente?

Exemplo:.

Se o valor da coluna Realizado for maior que 0 a imagem a ser mostrada no botão é delete_disabled.png
Se o valor da coluna Realizado for igual a 0 a imagem a ser mostrada no botão é delete.png

Estou utilizando a classe:

[code]public class ButtonColumn extends AbstractCellEditor
implements TableCellRenderer, TableCellEditor, ActionListener, MouseListener
{
private JTable table;
private Action action;
private int mnemonic;
private Border originalBorder;
private Border focusBorder;

private JButton renderButton;
private JButton editButton;
private Object editorValue;
private boolean isButtonColumnEditor;
    

/**
 *  Create the ButtonColumn to be used as a renderer and editor. The
 *  renderer and editor will automatically be installed on the TableColumn
 *  of the specified column.
 *
 *  @param table the table containing the button renderer/editor
 *  @param action the Action to be invoked when the button is invoked
 *  @param column the column to which the button renderer/editor is added
 */
public ButtonColumn(JTable table, Action action, int column)
{
            super();
	this.table = table;
	this.action = action;

	renderButton = new JButton();
	editButton = new JButton();
	editButton.setFocusPainted( false );
	editButton.addActionListener( this );
	originalBorder = editButton.getBorder();
	//setFocusBorder( new LineBorder(Color.BLUE) );

	TableColumnModel columnModel = table.getColumnModel();
	columnModel.getColumn(column).setCellRenderer( this );
	columnModel.getColumn(column).setCellEditor( this );
	table.addMouseListener( this );
}


/**
 *  Get foreground color of the button when the cell has focus
 *
 *  @return the foreground color
 */
public Border getFocusBorder()
{
	return focusBorder;
}

/**
 *  The foreground color of the button when the cell has focus
 *
 *  @param focusBorder the foreground color
 */
public void setFocusBorder(Border focusBorder)
{
	this.focusBorder = focusBorder;
	editButton.setBorder( focusBorder );
}

public int getMnemonic()
{
	return mnemonic;
}
    /**
 *  Recebe o nome do arquivo que será incluído no botao da celula
 *
 *  @param focusBorder the foreground color
 */
    public void setImagemDoBotao(String nome_imagem) throws IOException {
        renderButton.setIcon(new ImageIcon(Util.getImagem(nome_imagem)));
     }

/**
 *  The mnemonic to activate the button when the cell has focus
 *
 *  @param mnemonic the mnemonic
 */
public void setMnemonic(int mnemonic)
{
	this.mnemonic = mnemonic;
	renderButton.setMnemonic(mnemonic);
	editButton.setMnemonic(mnemonic);
}

@Override
public Component getTableCellEditorComponent(
	JTable table, Object value, boolean isSelected, int row, int column)
{
	if (value == null)
	{
		editButton.setText( "" );
		editButton.setIcon( null );
	}
	else if (value instanceof Icon)
	{
		editButton.setText( "" );
		editButton.setIcon( (Icon)value );
	}
	else
	{
		editButton.setText( value.toString() );
		editButton.setIcon( null );
	}

	this.editorValue = value;
	return editButton;
}

@Override
public Object getCellEditorValue()
{
	return editorValue;
}

//
// Implement TableCellRenderer interface
//
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
} else {
renderButton.setForeground(table.getForeground());
//renderButton.setBackground(UIManager.getColor(“Button.background”));
renderButton.setBackground(Color.LIGHT_GRAY);
}

    if (hasFocus) {
        renderButton.setBorder(focusBorder);
    } else {
        renderButton.setBorder(originalBorder);
    }

// renderButton.setText( (value == null) ? “” : value.toString() );
if (value == null) {
renderButton.setText("");
// renderButton.setIcon(null);
} else if (value instanceof Icon) {
renderButton.setText("");
// renderButton.setIcon((Icon) value);
} else {
renderButton.setText(value.toString());
// renderButton.setIcon(null);
}

    return renderButton;
}

//
// Implement ActionListener interface
//
/*
* The button has been pressed. Stop editing and invoke the custom Action
*/
@Override
public void actionPerformed(ActionEvent e)
{
int row = table.convertRowIndexToModel( table.getEditingRow() );
fireEditingStopped();

	//  Invoke the Action

	ActionEvent event = new ActionEvent(
		table,
		ActionEvent.ACTION_PERFORMED,
		"" + row);
	action.actionPerformed(event);
}

//
// Implement MouseListener interface
//
/*
* When the mouse is pressed the editor is invoked. If you then then drag
* the mouse to another cell before releasing it, the editor is still
* active. Make sure editing is stopped when the mouse is released.
*/
@Override
public void mousePressed(MouseEvent e)
{
if (table.isEditing()
&& table.getCellEditor() == this) {
isButtonColumnEditor = true;
}
}

@Override
public void mouseReleased(MouseEvent e)
{
	if (isButtonColumnEditor
	&&  table.isEditing()) {
        table.getCellEditor().stopCellEditing();
    }

	isButtonColumnEditor = false;
}

@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}

}[/code]

A questão de desabilitar a celula de acordo com o valor eu já consegui fazer, porém queria que para o usuário desse a sensação de que o botão está desabilitado, por isso estou querendo alterar a imagem da celula de com base no valor de uma determinada coluna.

Ué… é só trocar o icone de acordo com o value recebido pelo getTableCellRendererComponent

Opa ViniGodoy,

Desculpe minha ignorância no assunto, mas essa classe será utilizada por diversos outros grids em meu sistema, para isso eu devo ter uma classe desta para cada grid?

Vini…consegui!! muito obrigado pela ajuda :slight_smile:

Fiz o seguinte:

Criei uma classe ButtonColumn só para o grid que estou tentando fazer tal procedimento e adicionei a seguinte validação:

[code] @Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
if (isSelected) {
renderButton.setForeground(table.getSelectionForeground());
renderButton.setBackground(table.getSelectionBackground());
} else {
renderButton.setForeground(table.getForeground());
//renderButton.setBackground(UIManager.getColor(“Button.background”));
renderButton.setBackground(Color.LIGHT_GRAY);
}

    if (hasFocus) {
        renderButton.setBorder(focusBorder);
    } else {
        renderButton.setBorder(originalBorder);
    }

// renderButton.setText( (value == null) ? “” : value.toString() );
try {

        ModeloTabelaComposicaoDoPacote dadosTabela = (ModeloTabelaComposicaoDoPacote) table.getModel();
        if (dadosTabela.getDadosComposicaoPacote(row).getPesoSecoTotalRealizado()  > 0) {
            renderButton.setText("");
            this.setImagemBotao("delete2disabled.png");
        } else {
            renderButton.setText("");
            this.setImagemBotao("delete2.png");
        }
    } catch (Exception ex) {
        System.out.println("Erro" + ex);
    }
    return renderButton;
}[/code]