Colocar um jComboBox em uma jTable no visual

7 respostas
A

Bom dia Pessoal, bom pesquisei bastante nos tópicos aqui do fórum, tentei todas as maneiras que achei por aqui mas não consegui inserir um jcombobox em uma coluna da jtable.
O que acontece é o seguinte esta minha jTable eu inseri ela manualmente no netbeans ai agora criei uma coluna tb manualmente do tipo boolean, e quero que essa coluna seja um jcombobox…

Desde ja agradeço

Abraços.

7 Respostas

Marlon_Meneses

pesquise sobre tablecellrender

Fexx

Cara acho que isso vai lhe ajuda.

A

tem como postar algum exemplo…?

A

Fexx:
Cara acho que isso vai lhe ajuda.


Cara o que o autofiltro tem aver com o que preciso, eu li mas não me situei, tipo eu só preciso de um jcombobox em uma celula da jtable.

Fexx

Cara, não sei pra que quer, um jcomboBox em um jtable, pensei que fosse para filtro.

Tipo assim:

Marlon_Meneses
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.EventQueue;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.List;
import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;


public class Tables extends JFrame {

    private JScrollPane scrollPane;
    private final JTable table = new JTable();
    private LabelTotal labelTotal;

    public Tables() {
        init();
    }

    final void init() {

        List<Produto> l = new LinkedList<Produto>();

        l.add(new Produto("Produto 1", 3.5, 650));
        l.add(new Produto("Produto 2", 53.5, 450));
        l.add(new Produto("Produto 3", 300.0, 120));
        l.add(new Produto("Produto 4", 50.5, 55));
        l.add(new Produto("Produto 5", 38.55, 80));
        l.add(new Produto("Produto 6", 74.0, 60));
        l.add(new Produto("Produto 7", 0.5, 20));
        l.add(new Produto("Produto 8", 1.5, 500));

        table.setModel(new TableProdutoModel(l));
        table.setRowHeight(20);
        
        labelTotal = new LabelTotal(((TableProdutoModel) table.getModel()).getTotal());

        table.setDefaultRenderer(Double.class, new TableProdutoRender());
        table.setDefaultRenderer(String.class, new TableDescricaoProdudo());
        
        table.getColumn("Produto").setCellEditor(new DefaultCellEditor(new JComboBox(new DefaultComboBoxModel(new String[]{"Produto 1", "Produto 2", "Produto 3", "Produto 4", "Produto 5", "Produto 6", "Produto 7", "Produto 8"}))));

        ((TableProdutoModel) table.getModel()).addTableModelListener(new TableModelListener() {

            @Override
            public void tableChanged(TableModelEvent e) {
                labelTotal.setText(((TableProdutoModel) table.getModel()).getTotal());
            }
        });

        scrollPane = new JScrollPane(table);


        this.setLayout(new BorderLayout());

        this.add(scrollPane, BorderLayout.CENTER);
        this.add(labelTotal, BorderLayout.PAGE_END);

        this.pack();
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new Tables();
            }
        });
    }
}

class Produto {

    private String produto;
    private Double valor;
    private Integer qnt;

    public Produto() {
    }

    public Produto(String produto, Double valor, Integer qnt) {
        this.produto = produto;
        this.valor = valor;
        this.qnt = qnt;
    }

    public String getProduto() {
        return produto;
    }

    public void setProduto(String produto) {
        this.produto = produto;
    }

    public Integer getQnt() {
        return qnt;
    }

    public void setQnt(Integer qnt) {
        this.qnt = qnt;
    }

    public Double getValor() {
        return valor;
    }

    public void setValor(Double valor) {
        this.valor = valor;
    }
}

class TableProdutoModel extends AbstractTableModel {

    private List<Produto> listProduto;
    private final String colunas[] = new String[]{"Produto", "Valor", "Quantidade", "Total"};

    public TableProdutoModel() {
        this.listProduto = new LinkedList<Produto>();
    }

    public TableProdutoModel(List<Produto> listProduto) {
        this.listProduto = listProduto;
    }

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Produto p = listProduto.get(rowIndex);
        switch (columnIndex) {
            case 0:
                return p.getProduto();
            case 1:
                return p.getValor();
            case 2:
                return p.getQnt();
            case 3:
                return p.getQnt() * p.getValor();
            default:
                return null;
        }
    }

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

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Produto p = listProduto.get(rowIndex);
        switch (columnIndex) {
            case 0:
                p.setProduto(aValue.toString());
                break;
            case 1:
                p.setValor(new Double(aValue.toString()));
                break;
            case 2:
                p.setQnt(new Integer(aValue.toString()));
                break;
        }
        fireTableRowsUpdated(rowIndex, rowIndex);
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return columnIndex < colunas.length - 1;
    }

    public Double getTotal() {
        double total = 0;
        for (Produto p : listProduto) {
            total += p.getQnt() * p.getValor();
        }
        return total;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case 0:
                return String.class;
            case 1:
                return Double.class;
            case 2:
                return Integer.class;
            case 3:
                return Double.class;
            default:
                return null;
        }
    }
}

class TableProdutoRender extends DefaultTableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JLabel c = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
        c.setText(new DecimalFormat("¤###,##0.00").format(new Double(value.toString())));
        c.setHorizontalAlignment(JLabel.RIGHT);
        return c;
    }
}

class LabelTotal extends JLabel {

    public LabelTotal(Double valor) {
        this.setText(valor);
        this.setHorizontalAlignment(JLabel.RIGHT);
    }

    public void setText(Double valor) {
        setText("Total: " + new DecimalFormat("¤###,##0.00").format(valor));
    }
}

class TableDescricaoProdudo extends DefaultTableCellRenderer{

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        JComboBox combo = new JComboBox(new DefaultComboBoxModel(new String[]{"Produto 1", "Produto 2", "Produto 3", "Produto 4", "Produto 5", "Produto 6", "Produto 7", "Produto 8"}));
        combo.setSelectedItem(value.toString());
        return combo;
    }
    
}
A

Coloquei com uma linha só de código mesmo …

jTable1.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(jComboBox1));
Criado 25 de janeiro de 2012
Ultima resposta 25 de jan. de 2012
Respostas 7
Participantes 3