JTable com JComboBox

5 respostas
bruxel

vamos la então,

Galera to com um probleminha, não consigo fazer funcionar

segue meu codigo para verem.

esse exemplo peguei da net, parte do guj e parte de outro site.

tentei montar algo funcional mas nao ta dando certo, minha combo nao fica selecionada no item que eu quero e as vezes quando fica, ai troco de row(linha) aquela que estava selecionada passa para a atual.

muito estranho

5 Respostas

ViniGodoy

Onde está a implementação do método

Do seu TableCellEditor? É ele quem configura o seu editor, na hora que ele deve aparecer.
Use-o para selecionar o item “value” na sua combo.

Outra coisa. Por que seu TableModel tem aquele array de objects ali? Não era mais fácil criar um List<File> no lugar ?

Usar um array de object consegue ser uma idéia mais idiota do que usar o DefaultTableModel. Isso porque é uma cópia do que o DefaultTableModel faz, com todos os problemas que ele tem, mas sem as implementações padrão que ele já trás…

Dica: Quando copiar e colar código, procure ir atrás do JavaDoc e das documentações das classes que você está copiando. Leia a fundo como funciona um TableCellRenderer e um TableCellEditor. Programação não é playmobil. Pelo menos, não até você entender o formato da peça que está tentando encaixar.

bruxel

Vini,

percebo que vc é um kara q conhece muito esta parte de tables, models, renderers editors e bla, bla, bla, e talvez esse muito conhecimento faça com que vc as vezes se encomode com pessoas como eu que não manja muito.

bem, apaguei o exemplo, pq como tinha dito, tinha pego da net pra mostrar, mas foi uma burrada minha, não deveria ter feito.

o meu código que eu fiz realmente não esta comigo agora, esta em outra maquina.

criei o renderer, e o editor como vc tinha perguntado, e dentro do editor acredito eu que eu deva fazer a parte de inclusão dos dados na combo estou certo ou errado ?

bem, fiz a principio assim, porem o que esta acontecendo, minha table não mantem a seleção da combo, fazendo com que ela sempre inicialize, ou va para o primeiro item da combo.

aguardo o seu parecer

ViniGodoy

Bom, então poste seu código de verdade. Aí poderemos ver o que está errado.

Agora, provavelmente é esse método que indiquei que está faltando implementar.

bruxel

la vai

table

package table;

import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableColumnModel;

public class VisitaTable extends JTable
{
    private VisitaTableModel tableModel = new VisitaTableModel();

    private VisitaTableComboBoxRenderer comboRenderer = new VisitaTableComboBoxRenderer();

    public VisitaTable()
    {
        setModel( tableModel );
        setSelectionMode( ListSelectionModel.SINGLE_SELECTION );

        TableColumnModel tcm = getColumnModel();
        tcm.getColumn( VisitaTableModel.COL_CLIENTE ).setMaxWidth( 350 );
        tcm.getColumn( VisitaTableModel.COL_CLIENTE ).setMinWidth( 350 );
        tcm.getColumn( VisitaTableModel.COL_CLIENTE ).setPreferredWidth( 350 );
        tcm.getColumn( VisitaTableModel.COL_MOTIVO ).setMaxWidth( 350 );
        tcm.getColumn( VisitaTableModel.COL_MOTIVO ).setMinWidth( 350 );
        tcm.getColumn( VisitaTableModel.COL_MOTIVO ).setPreferredWidth( 350 );

        tcm.getColumn( VisitaTableModel.COL_MOTIVO ).setCellRenderer( comboRenderer );
    }

    public Vector<GeralED> getItems()
    {
        return tableModel.getItems();
    }

    public void setItems( Vector<GeralED> items )
    {
        tableModel.setItems( items );
    }

    public GeralED getSelectedItem()
    {
        GeralED selected = null;

        int row = getSelectedRow();

        if ( row != -1 )
        {
            selected = tableModel.getItemAt( row );
        }

        return selected;
    }

    public void setSelectedItem( GeralED selected )
    {
        clearSelection();

        if ( selected != null )
        {
            int row = tableModel.getItems().indexOf( selected );

            if ( row != -1 )
            {
                setRowSelectionInterval( row, row );
            }
        }
    }

    public void filterItems()
    {
        tableModel.filterItems();
    }
}

tablemodel

package table;

import java.util.Vector;
import javax.swing.table.AbstractTableModel;

public class VisitaTableModel extends AbstractTableModel
{
    public static final int COL_CLIENTE = 0;
    public static final int COL_MOTIVO  = 1;

    public static String[] COLUMN_NAMES =
    {
        "Cliente",
        "Motivo"
    };

    private Vector<GeralED> items = new Vector<GeralED>();

    private Vector<GeralED> itemsBackup = new Vector<GeralED>();

    public Vector<GeralED> getItems()
    {
        return items;
    }

    public void setItems( Vector<GeralED> v )
    {
        if ( v == null )
        {
            throw new IllegalArgumentException( "Items vector cannot be null!" );
        }

        this.items = new Vector( v );

        this.itemsBackup = new Vector( v );

        fireTableDataChanged();
    }

    @Override
    public int getRowCount()
    {
        return items.size();
    }

    @Override
    public int getColumnCount()
    {
        return COLUMN_NAMES.length;
    }

    @Override
    public String getColumnName( int column )
    {
        return COLUMN_NAMES[column];
    }

    public GeralED getItemAt( int row )
    {
        return items.elementAt( row );
    }

    @Override
    public boolean isCellEditable( int rowIndex, int columnIndex )
    {
        return columnIndex == COL_MOTIVO;
    }

    @Override
    public Object getValueAt( int row, int column )
    {
        Object value = null;

        GeralED item = getItemAt( row );

        switch ( column )
        {
            case COL_CLIENTE:
                value = item.getStringNotNull( "nomcliente" );
                break;

            case COL_MOTIVO:
                value = item.getVector( "vecMotivos", new Vector<GeralED>() );
                break;
        }

        return value;
    }

    @Override
    public void setValueAt( Object aValue, int rowIndex, int columnIndex )
    {
        GeralED item = getItemAt( rowIndex );

        switch ( columnIndex )
        {
            case COL_MOTIVO:
                item.put( "codmotivovisita", ( (GeralED) aValue ).getInteger( "codigo" ) );
                break;
        }

        fireTableCellUpdated( rowIndex, columnIndex );

        this.fireTableDataChanged();
    }

    public void filterItems()
    {
        Vector<GeralED> i = new Vector<GeralED>();

        for ( GeralED ed : this.itemsBackup )
        {
            if ( ! ed.getBoolean( "indnaovisita", false ) )
            {
                continue;
            }

            i.add( ed );
        }

        this.items = i;

        fireTableDataChanged();
    }
}

renderer combo

package table;

import java.awt.Color;
import java.awt.Component;
import java.util.Vector;
import javax.swing.UIManager;
import javax.swing.table.TableCellRenderer;

public class VisitaTableComboBoxRenderer extends JComboBox<GeralED> implements TableCellRenderer
{
    private Color defaultTextSelectionColor       = UIManager.getColor( "Table.selectionForeground" );
    private Color defaultBackgroundSelectionColor = UIManager.getColor( "Table.selectionBackground" );

    public VisitaTableComboBoxRenderer()
    {
        super();

        super.setOpaque( true );
    }

    @Override
    public Component getTableCellRendererComponent( javax.swing.JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column )
    {
        this.setItens( (Vector<GeralED>) value );
        
        if ( isSelected )
        {
            this.setBackground( defaultBackgroundSelectionColor );
            this.setForeground( defaultTextSelectionColor );
        }

        else
        {
            this.setBackground( table.getBackground() );
            this.setForeground( table.getForeground() );
        }

        return this;
    }
}
bruxel

pessoal

alguem pode me dar um exemplo de um table com combo funcional

Criado 7 de outubro de 2010
Ultima resposta 16 de out. de 2010
Respostas 5
Participantes 2