Botões diferentes em uma mesma coluna do Jtable

3 respostas
S

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:

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) {}
}

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.

3 Respostas

ViniGodoy

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

S

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?

S

Vini...consegui!! muito obrigado pela ajuda :)

Fiz o seguinte:

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

@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;
    }
Criado 22 de fevereiro de 2013
Ultima resposta 23 de fev. de 2013
Respostas 3
Participantes 2