Puesto que no hay forma automática de hacerlo :( estoy usando un mapa para mantener mis valores y clave
private TreeMap <Integer, String> categoryMap = new TreeMap<Integer, String>();
private JComboBox comboCategory = new JComboBox();
..
conseguir todas las categorías (de llave, valor) y poblar el mapa y combinado
private void addComboColumnData() {
try {
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection(conURL);
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("SELECT id, name FROM categories");
comboCategory.removeAllItems();
comboCategory.addItem(""); // blank value.
categoryMap.clear();
while(rs.next()){
String name = rs.getString("name");
comboCategory.addItem(name);
categoryMap.put(rs.getInt("id"), name);
}
rs.close();
conn.close();
} catch (Exception e){
JOptionPane.showMessageDialog(this, e.toString());
e.printStackTrace();
}
}
la fo urth la columna de mi JTable debe ser cuadro combinado,
// set the fourth column as combo
TableColumn categoryColumn = tableData.getColumnModel().getColumn(4);
categoryColumn.setCellEditor(new DefaultCellEditor(comboCategory));
Al editar el valor en el cuadro combinado, se mostrará el texto, sino a la actualización del valor de la tabla de base de datos tengo que obtener la clave entera.
// show Category name in text in the category field.
if(columnNames[i].equalsIgnoreCase("category")){
Object obj = rs.getObject(i+1);
if(obj != null && (obj instanceof Integer))
row[i] = (String) categoryMap.get((Integer) obj);
}
Para la actualización de base de datos,
Object value = tableData.getModel().getValueAt(rowIndex, 4);
int categoryID = 0;
if(value!= null){
if (value instanceof String && !((String)value).isEmpty()) {
categoryID = getKeyForValue((String)value);
} else if(value instanceof Number) {
categoryID = (Integer) value;
}
}
Y aquí está el getKeyForValue,
private int getKeyForValue(String value) {
for (Entry<Integer, String> entry : categoryMap.entrySet()) {
if (entry.getValue().equals(value)) {
return entry.getKey();
}
}
return 0;
}
veces odio a java..para una tarea simple hay tantos códigos – aswzen