java - tabla - pasar datos de un combobox a un jtable
Elemento de cadena JCombobox(visible) y clave entera(inherente) (2)
Debe almacenar un Objeto en TableModel que contenga tanto el valor de cadena para mostrar como el valor entero para la clave. Luego accedes a table.getValueAt (...) tienes acceso al objeto que contiene ambas piezas de información.
Aquí hay un ejemplo para un cuadro combinado independiente:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
public class ComboBoxItem extends JFrame implements ActionListener
{
public ComboBoxItem()
{
Vector model = new Vector();
model.addElement( new Item(1, "car" ) );
model.addElement( new Item(2, "plane" ) );
model.addElement( new Item(3, "train" ) );
model.addElement( new Item(4, "boat" ) );
model.addElement( new Item(5, "boat aadf asfsdf a asd asd" ) );
JComboBox comboBox;
// Easiest approach is to just override toString() method
// of the Item class
comboBox = new JComboBox( model );
comboBox.addActionListener( this );
getContentPane().add(comboBox, BorderLayout.NORTH );
// Most flexible approach is to create a custom render
// to diplay the Item data
comboBox = new JComboBox( model );
comboBox.setRenderer( new ItemRenderer() );
comboBox.addActionListener( this );
getContentPane().add(comboBox, BorderLayout.SOUTH );
}
public void actionPerformed(ActionEvent e)
{
JComboBox comboBox = (JComboBox)e.getSource();
Item item = (Item)comboBox.getSelectedItem();
System.out.println( item.getId() + " : " + item.getDescription() );
}
class ItemRenderer extends BasicComboBoxRenderer
{
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus)
{
super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
if (value != null)
{
Item item = (Item)value;
setText( item.getDescription().toUpperCase() );
}
if (index == -1)
{
Item item = (Item)value;
setText( "" + item.getId() );
}
return this;
}
}
class Item
{
private int id;
private String description;
public Item(int id, String description)
{
this.id = id;
this.description = description;
}
public int getId()
{
return id;
}
public String getDescription()
{
return description;
}
public String toString()
{
return description;
}
}
public static void main(String[] args)
{
JFrame frame = new ComboBoxItem();
frame.setDefaultCloseOperation( EXIT_ON_CLOSE );
frame.pack();
frame.setVisible( true );
}
}
Tengo un esquema de base de datos = que se mostrará en un JCombobox como una columna JTable para seleccionar un nombre. Pero quiero que el campo ID se inserte (como una clave externa) en otra tabla.
Por lo general, al seleccionar un elemento en el menú desplegable, lleva el elemento seleccionado al área mostrada del cuadro combinado.
Lo que quiero hacer es, cuando seleccione cualquier elemento (cadena) en el cuadro combinado, su clave entera correspondiente (puede mantenerse en un mapa ordenado) se debe mostrar en el área de marcador de posición del cuadro combinado, de modo que cuando tome el valor de JTable. getValueAt (fila, columna), obtengo la clave entera, no el valor del elemento de cadena. Por favor, ayúdame, ¿cómo puedo hacer eso?
Como no hay una 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();
Obtenga todas las categorías (clave, valor) y complete el mapa y combo
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 cuarta columna de mi JTable debería ser combobox,
// 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, muestra el texto, pero para actualizar el valor en la tabla de la 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 la 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;
}