style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Combobox dentro de jtable (¿Es posible que cada combobox tenga una lista desplegable distinta?)

Saludos, tengo una duda con respecto al titulo del tema.

Resulta que muestro en un jtable un vector de componentes combobox y se ve perfectamente, el problema ocurre cuando voy a seleccionar un combo creado (que segun lo que puedo ver cada uno debe ser independiente, ya que los creo con vectores de componentes), pues resulta que la lista de seleccion que introduje en cada combo desaparecen y en su lugar todos los combobox toman la lista del ultimo combo llenado...

int Cedula;
int filase;
String CodiMateriaFase="";
String Condicion="";
Cedula=Integer.parseInt(txtInscribirCedulaAlumno.getText());//Cedula del alumno

ComboCondicion = new JComboBox[fila]; //fila guarda el numero de filas de la tabla

for (filase=0;filase<=fila;filase++){
Condicion="";
CodiMateriaFase=(String) ObjTablaInscripcion.getValueAt(filase, 0);
Condicion=VerCondicion(CodiMateriaFase, Cedula); //llamo una funcion que devuelve 4 posibles valores
//1)"Reprobada", 2)"Reprobada"
//3) "No Inscrita"4)"Cursando"

TableColumn sportColumn = TablaInscripcion.getColumnModel().getColumn(6);//Para combobox en colum 6

ComboCondicion[filase]= new JComboBox(); //creo el objeto combobo como un vector

if (Condicion.equals("No Inscrita") || Condicion.equals("Reprobada")){
ComboCondicion[filase].addItem(Condicion);
ComboCondicion[filase].addItem("Inscribir");
ComboCondicion[filase].setSelectedItem(Condicion);
ComboCondicion[filase].setEditable(false);
}
if (Condicion.equals("Cursando")){
ComboCondicion[filase].addItem(Condicion);
ComboCondicion[filase].addItem("Retirar");
ComboCondicion[filase].setSelectedItem(Condicion);
}
if (Condicion.equals("Aprobada")){
ComboCondicion[filase].addItem(Condicion);
ComboCondicion[filase].setSelectedItem(Condicion);
}
sportColumn.setCellEditor(new DefaultCellEditor(ComboCondicion[filase]));
ObjTablaInscripcion.setValueAt(ComboCondicion[filase].getSelectedItem(),filase, 6);
}

Si pueden notar dependiendo de lo que me arroje la funcion "VerCondicion" lleno cada combobox de cada fila con los valores independientes un combo box de otro...

Al correrlo se ve bien pero al seleccionar cualquier combobox de cualquier fila, las opciones que aparecen son las mismas...

Es posible que cada combobox tenga una lista desplegable distinta...

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de JaimeItlzc

Por el for()

Por el for(), la vdd no comprendo lo que quieres hacer me podrias explicar(mas especifico) y a tu pregunta del tema creo si es posible.
Con gusto te ayudo perdon por tardar en responder.

Saludos.

Ok explico un poco

Gracias por responder...

La variable "fila", guarda el tamaño de la tabla, en el FOR hago un barrido por toda la tabla con "filase", esta ultima variable me indica la fila que estoy trabajando. (osea voy desde la fila 0 hasta la ultima que es la variable "fila").

con la linea,
Condicion=VerCondicion(CodiMateriaFase, Cedula);

Llamo a una funcion que al darle como datos la cedula del alumno y el codigo de la materia (que tomo de la fila en cuestion), me devuelve si la materia ha sido aprobada, reprobada, se esta cursando o no ha sido inscrita..

Lo que quiero es que;
- Si la materia fue Reprobada o No ha sido Inscrita, el combo de esa fila muestre "Reprobada o No Inscrita" segun el caso y me muestre otra opcion llamada "Incribir".
- Si la materia se esta cursando, el combo de esa fila muestre "Cursando" y de la opcion de "Retirar"
- Si la materia es aprobada el combo de esa fila solo muestre este valor y mas ningun otro.

El problema es que cuando selecciono cualquier celda donde se encuentran un combo especifico, la lista desplegable que muestra es la correspondiente a la ultima "condicion" de la ultima materia consultada y siempre igual para todos los combos.

Ej.
a) Si la ultima condicion fue "Aprobada" entonces todos los combos muestran solo la opcion aprobada
b)Si la ultima condicion fue "En curso" entonces todos los combos muestran la opcion "En curso" y la Opcion "Retirar".
c)Si la ultima condicion fue "No Iscrita o reprobada" todos los combos muestran "No Iscrita o reprobada" segun el caso e "Inscribir".

Entonces solo se esta rigiendo por la condicion de la ultima materia de la tabla y no se rige segun lo que quiero (que cada combobox muestre una lista desplegable distinta o segun un criterio dado)...

De verdad gracias por responder. Espero haber sido claro... Gracias cualquier duda, hasmela saber.

Imagen de Nopalin

Recreo tu codigo con las etiquetas blockcode

 int Cedula;
int filase;
String CodiMateriaFase="";
String Condicion="";
Cedula=Integer.parseInt(txtInscribirCedulaAlumno.getText());//Cedula del alumno

ComboCondicion = new JComboBox[fila]; //fila guarda el numero de filas de la tabla

for (filase=0;filase<=fila;filase++){
Condicion="";
CodiMateriaFase=(String) ObjTablaInscripcion.getValueAt(filase, 0);
Condicion=VerCondicion(CodiMateriaFase, Cedula); //llamo una funcion que devuelve 4 posibles valores
//1)"Reprobada", 2)"Reprobada"
//3) "No Inscrita"4)"Cursando"

TableColumn sportColumn = TablaInscripcion.getColumnModel().getColumn(6);//Para combobox en colum 6

ComboCondicion[filase]= new JComboBox(); //creo el objeto combobo como un vector

if (Condicion.equals("No Inscrita") || Condicion.equals("Reprobada")){
ComboCondicion[filase].addItem(Condicion);
ComboCondicion[filase].addItem("Inscribir");
ComboCondicion[filase].setSelectedItem(Condicion);
ComboCondicion[filase].setEditable(false);
}
if (Condicion.equals("Cursando")){
ComboCondicion[filase].addItem(Condicion);
ComboCondicion[filase].addItem("Retirar");
ComboCondicion[filase].setSelectedItem(Condicion);
}
if (Condicion.equals("Aprobada")){
ComboCondicion[filase].addItem(Condicion);
ComboCondicion[filase].setSelectedItem(Condicion);
}
sportColumn.setCellEditor(new DefaultCellEditor(ComboCondicion[filase]));
ObjTablaInscripcion.setValueAt(ComboCondicion[filase].getSelectedItem(),filase, 6);
}

Solo como un consejo, pon el codigo entre las etiquetas blockcode para que sea mas entendible.

Tu error es que estas mal interpretando la funcionalidad del CellEditor, este se aplica a todas las celdas de la columna, y tu en cada fila lo estas cambiando y por ende, se queda el ultimo que asignaste.
Sinceramente no recuerdo, pero por ahi el JTable tiene un metodo getValueAt, el cual llama para pedir el valor y asignarlo al componente del celleditor (el JTable se lo pide a TableModel). Lo que tienes que hacer es una implementacion de DefaultTableModel el cual regrese el valor adecuado para cada celda. En el caso del las celdas de la columna que mencionas, regresar algun array o lista, y en tu celleditor, castear el valor que te pasa a ese array o lista y llenar el combo.

Saludos, espero haber sido claro.

Gracias

De verdad muchas gracias... He buscado la forma de lograr que en una columna cada combobox tenga una lista desplegable distinta y al paracer ya han intentado lograr esta meta en varios foros y nadie a logrado tal fin, ya que tal como muy bien dijiste, "CellEditor, este se aplica a todas las celdas de la columna". Buscare otra forma de rersolver este detalle. Gracias por tu ayuda me sirvio de mucho...

Imagen de Nopalin

un rapido ejemplo

Así a la rapida hize un ejemplo básico. Lo que tu necesitas es mostrar un valor en esa celda, y cuando se de clic se desplegue unalista de valores, diferente para cada fila verdad? Bueno pues el meollo del asunto es que tienes que crear un CellEditor que se llene con estos valores, por lo tanto al cell editor le pasas la lista o array de elementos que debe mostrar para cada fila.
En este ejemplo yo utilize un List para simular las filas, y cada objeto del list contiene un array que son las opciones a mostrar. El unico inconveniente es que el mismo orden de datos que asignas a la tabla es el que debes utilizar para crear las opciones y el cellEditor las muestre correctamente.

package pm.singles.swing;

import java.awt.BorderLayout;
import java.awt.Component;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableColumn;

public class ComboTable extends JFrame{

        public static void main(String[] args){
                try{
                        ComboTable table = new ComboTable();
                        table.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        table.setVisible(true);
                } catch(Exception ex){
                        ex.printStackTrace();
                        System.exit(0);
                }
        }
       
        public ComboTable(){
                //creamos el modelo de datos
                String[][] data = new String[][] {
                                {"Juan", "P", "Moreno", "No Inscrita"},
                                {"Pancrasio", "Martinez", "Hernandez", "Reprobado"},
                                {"Chucho", "El trigre", "Gutierrez", "Aprobada"},
                                {"Jose andrea", "Mago", "de Oz", "Cursando"},
                                {"David", "Olivares", "Moreno", "No Inscrita"}};
               
                List<String[]> lista = new ArrayList<String[]>();
                lista.add(new String[]{"No Inscrita", "Inscribir"});
                lista.add(new String[]{"Reprobado", "Inscribir"});
                lista.add(new String[]{"Aprobada"});
                lista.add(new String[]{"Cursando", "Retirar"});
                lista.add(new String[]{"No Inscrita", "Inscribir"});
               
                JTable table = new JTable(data, new String[]{"Column1", "Column2", "Column3", "Column4"});
               
                //asiganmos un cellrenderer para la ultima columna
                TableColumn col = table.getColumnModel().getColumn(3);
                col.setCellEditor(new MyComboEditor(lista));
               
                setLayout(new BorderLayout());
                add(new JScrollPane(table), BorderLayout.CENTER);
                setSize(400, 200);
        }
       
        private class MyComboEditor extends DefaultCellEditor{
               
                List<String[]> values;
               
                public MyComboEditor(List<String[]> values){
                        super(new JComboBox());
                        this.values = values;
                }
               
                public Component getTableCellEditorComponent(JTable table, Object value,
                          boolean isSelected, int row, int column) {
                       
                        JComboBox combo = (JComboBox)getComponent();
                        combo.removeAllItems();
                        String[] valores = values.get(row);
                       
                        for(int i=0; i<valores.length; i++){
                                combo.addItem(valores[i]);
                        }
                        combo.setSelectedItem(value);
                       
                        return combo;
                }
        }
}

Saludos

Resuelto

Gracias fue de gran ayuda tu apoyo... termine creando el combo cada vez que se presiona sobre una celda deseada... verifico si la celda pertenece a la columna donde quiero el combo y lo creo...

OTRA OPCION.... RESUELTO

tuve ese mismo problema pero logre resolverlo gracias a Dios...
tal vez te sirva el code:
// CLASE VENTANA

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;

public class Ventana extends JFrame implements ActionListener{
private JTable tabla;
private JScrollPane panel;
private JButton boton;
private Modelo mo;
List lista;

public static void main (String [] args){
Ventana v = new Ventana();
}

public Ventana(){
super("Ventana");
setLayout(null);
setBounds(50,50,300,200);

lista = new ArrayList ();
mo = new Modelo();

tabla = new JTable(mo);
panel = new JScrollPane(tabla);

panel.setBounds(10,10,200,120);

boton = new JButton("AGREGAR");
boton.setBounds(10,130,100,20);
boton.addActionListener(this);

add(panel);
add(boton);

setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void actionPerformed(ActionEvent e){
agregar agre;
if(e.getSource()==boton)
agre = new agregar(mo, tabla, lista);
}
}

// CLASE AGREGAR

import javax.swing.*;
import javax.swing.text.*;
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.*;

public class agregar extends JFrame implements ActionListener{
private JLabel n, o;
private JTextField nx, ox1, ox2, ox3;
private JButton boton;
private Modelo mo;
private JTable tabla;
private List lista;

public agregar(Modelo mo, JTable tabla, List lista){
super("agregar");
getContentPane().setLayout(new FlowLayout());
setBounds(50,50,300,200);

this.mo = mo;
this.tabla = tabla;
this.lista = lista;

n = new JLabel("nombre");
o = new JLabel("opciones");

nx = new JTextField(10);
ox1 = new JTextField(10);
ox2 = new JTextField(10);
ox3 = new JTextField(10);

boton = new JButton("AGREGAR");
boton.addActionListener(this);

add(n);
add(nx);
add(o);
add(ox1);
add(ox2);
add(ox3);

add(boton);

setVisible(true);
}

public void actionPerformed(ActionEvent e){
if(e.getSource()==boton){
mo.insertaFila(new cosas(nx.getText(), ox1.getText(), ox2.getText(), ox3.getText()));
System.out.println("INSERTADO EN MODELO....");
conftabla();
System.out.println("INSERTADO EN LISTA....");
}
}

public void conftabla(){
int j = lista.size();

lista.add(j, new String[]{ox1.getText(), ox2.getText(), ox3.getText()});

TableColumn col = tabla.getColumnModel().getColumn(1);
col.setCellEditor(new MyComboEditor(lista));
}

private class MyComboEditor extends DefaultCellEditor{

List values;

public MyComboEditor(List values){
super(new JComboBox());
this.values = values;
}

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {

JComboBox combo = (JComboBox)getComponent();
combo.removeAllItems();

String[] valores = values.get(row);

System.out.println("LINEA : " + row);

for(int i=0; i

OTRA OPCION.... RESUELTO 2da parte

for(int i=0; i

OTRA OPCION.... RESUELTO 3era parte

// CLASE COSAS
public class cosas{
String nombre = "";
String op1 = "";
String op2 = "";
String op3 = "";

public cosas(String nombre, String op1, String op2, String op3){
this.nombre = nombre;
this.op1 = op1;
this.op2 = op2;
this.op3 = op3;
}

public String getNombre(){
return nombre;
}

public void setNombre(String nombre){
this.nombre = nombre;
}

public String getOp1(){
return op1;
}

public void setOp1(String op1){
this.op1 = op1;
}

public String getOp2(){
return op2;
}

public void setOp2(String op2){
this.op2 = op2;
}

public String getOp3(){
return op3;
}

public void setOp3(String op3){
this.op3 = op3;
}
}

OTRA OPCION.... RESUELTO el for

ahy un for que esta incompleto, no subio bien, pero aqui esta

for(int i=0;
i < valores.length;
i++){
combo.addItem((String)valores[i]);
}

tengo un problema similar y

tengo un problema similar y espero me puedes ayudar a solucionar esto lo mas pronto posible te agradeceria mucho, tengo un JTable y las filas que obtengo vienen de la base de datos, una columna de la tabla tiene que ser un JComboBox, pero ese JComboBox se debe lllenar con datos de la base de datos y va a tener distintos datos dependiendo de un dato que contenga esa misma fila pero en otra columna.

hago esto

DECLARACION
private JComboBox cboprecios;
private Vector vtrprecios;
private DefaultCellEditor dceCombo;
private TableColumnModel columnmodel;
private TableColumn tablecolumn;
private JTable table;
private DefaultTableModel tablamodelo;

INICIALIZACION
/**
DECLARACION DE MI TABLA Y MI MODELO DE TABLA(JTABLE Y DEFAULTTABLEMODEL)
**/

cboprecios = new JComboBox(vtrprecios);
cboprecios.addAncestorListener(this);

dceCombo= new DefaultCellEditor(cboprecios);
dceCombo.addCellEditorListener(this);

columnmodel = table.getColumnModel();
tablecolumn = columnmodel.getColumn(4);
tablecolumn.setCellEditor(dceCombo);

public void ancestorAdded(AncestorEvent event){}
public void ancestorRemoved(AncestorEvent event) {}

public void

public void ancestorMoved(AncestorEvent event)
{
int visibleRowIndex = tblProducto.getSelectedRow();
int realRowIndex = tblProducto.convertRowIndexToModel(visibleRowIndex);

String codigo= modeltblProducto.getVentaDirectaProducto(realRowIndex).getCodigo();

una regla que me devuelve un Vector con los datos traidos de la base de datos
rn_PrecioCabDet regla = new rn_PrecioCabDet();
cboprecios.removeAllItems();
vtrprecios.removeAllElements();
Vector vector = regla.listarPrecios(codigo);
for(int i=0 ; i

public void

public void editingStopped(ChangeEvent e)
{
int visibleRowIndex = tblProducto.getSelectedRow();
int realRowIndex = tblProducto.convertRowIndexToModel(visibleRowIndex);

modeltblProducto.getVentaDirectaProducto(realRowIndex).setP_unit(cboprecios.getSelectedItem().toString());
modeltblProducto.fireTableDataChanged();
}

public void editingCanceled(ChangeEvent e)
{

}

esto si me funciona pero mi problema es que la prrimera vez que doy un click sobre alguna celda de la columna 4 de la tabla
(columnmodel.getColumn(4)) no me cargan los datos esta bien entendible espero alguien me pueda ayudar o ver otra forma o decirme si eso
esta mal y darme una solucion , le agradeceria mucho si alguient iene una respuesta avisarme a mi correo
jamir.huaman.campos@gmail.com para ver si hay respuestas hasta luego

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">