Atualização dinâmica de JComboBox dentro JTable

3 respostas
viniciusfaleiro

To com uma JTable aqui e minha ultima coluna eu renderizo um combobox com dois valores predefinidos… O que eu to querendo fazer é o seguinte… se o cara vai na linha 3 e muda o valor desse combobox eu queria varrer o model da jTable para saber se tem mais alguma linha onde a coluna 0 da linha que eu alterei o combo são iguais. Por exemplo… na coluna 0 da linha 3 eu vou la e alter o combo pra um valor x… o valor dessa coluna zero é “Olá”. A coluna 0 das linhas 9 e 10 também têm esses valores. então o como box dessas linhas também deve ficar com o valor x… eu cheguei perto disso… soh que eu usei o itemstatechange e ele ta revalidando tudo aqui e no final das contas todos os combos ficam com o mesmo valor…

Se puder me ajudar agradeço…

Vai ai o que já consegui… soh q ta num loop infinito… eu tentei tratar pra não disparar o evento de alteração pra alguns casos pra não cair em loop (Por exemplo, não mudar o valor do JComboBox para o próprio Combo que disparou o evento. Isso geraria outro envendo de alteração e cairia num loop…). Más não ta rolando…

import java.awt.Component;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

/**
 *
 * @author Vinicius
 */
public class MyComboBoxRenderer extends JComboBox implements TableCellRenderer {

    public MyComboBoxRenderer(String[] items, JScrollPane p) {
        super(items);

        this.p = p;
        this.box = this;
    }

    public Component getTableCellRendererComponent(final JTable table,
            Object value, boolean isSelected, boolean hasFocus, final int row, int column) {

        this.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent e) {
                if (table.getSelectedRow() != row) {
                    return;
                }

                String item = table.getValueAt(table.getSelectedRow(), 3).toString();
                String servico = table.getModel().getValueAt(row, 0).toString();

                for (int i = 0; i < table.getRowCount(); i++) {
                    if ((table.getModel().getValueAt(i, 0).toString().compareTo(servico) == 0)) {

                        if (table.getValueAt(i, 3) == null || table.getValueAt(i, 3).toString().compareTo(item) != 0) {
                            table.setValueAt(item, i, 3);
                        }

                    }
                }

                p.setViewportView(table);
            }
        });

3 Respostas

viniciusfaleiro

Putlz… preciso entregar um software na segunda com isso… não consegui fazer ainda… ng sabe?

viniciusfaleiro

Não é possível cara… ng nunca fez isso??? nem imagina como faz?

ViniGodoy

Pode postar o seu TableModel? Algo está errado, pq vc está chamando o método setValueAt e getValueAt diretamente. Esse dois métodos, deviam ser de uso exclusivo do JTable.

O ideal seria criar um método por lá, que alterasse os demais valores, e chamasse o tableDataChanged para as linhas alteradas.

Criado 9 de dezembro de 2009
Ultima resposta 22 de dez. de 2009
Respostas 3
Participantes 2