2011-01-27 20 views
8

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.Elemento de cadena JCombobox (visible) y clave entera (inherente)

Normalmente, 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) debe mostrarse 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, ¿cómo puedo ayudarlo?

Respuesta

-2

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; 
} 
13

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í se muestra un ejemplo de 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); 
    } 

} 
+2

veces odio a java..para una tarea simple hay tantos códigos – aswzen

0

que tienen una gran e inteligente solución:

ResultSet resultSet = userBL.loadRoles(); 
      try { 
       Vector<Roles> vector = new Vector<>(); 
       while (resultSet.next()) { 
        vector.addElement(new Roles(resultSet.getInt(1), resultSet.getString(2)));             
       } 
       rolComboBox.setModel(new DefaultComboBoxModel(vector));    
      } catch (SQLException e) { 
       System.out.println("SQLException LoadRoles Combo:"+e); 
      } 

puse modelo para rolComboBox con un Vector con c ustom Object, el objeto resultSet contiene todos los datos de la base de datos. Después, cuando quiero obtener la identificación del comboBox obténgalo con el método getSelectedItem.

System.out.println("Rol Selected: "+ ((Roles)rolComboBox.getSelectedItem()).getId());