Элемент строки JCombobox (видимый) и целочисленный ключ (свойственный) - PullRequest
9 голосов
/ 28 января 2011

У меня есть схема базы данных =, которая будет показана в JCombobox в виде столбца JTable для выбора имени.Но я хочу, чтобы поле идентификатора было вставлено (как внешний ключ) в другую таблицу.

Обычно, выбирая пункт в выпадающем меню, переносят выбранный элемент в указанную область поля со списком.

Что я хочу сделать, так это то, что при выборе любого элемента (строки) в поле со списком его соответствующая целочисленная клавиша (может храниться в отсортированной карте) должна отображаться в области заполнителя поля со списком, чтобы призначение JTable.getValueAt (строка, столбец), я получаю целочисленный ключ, а не значение элемента строки.Пожалуйста, помогите мне, как я могу это сделать?

Ответы [ 3 ]

14 голосов
/ 28 января 2011

Вы должны сохранить объект в TableModel, который содержит и строковое значение для отображения, и целочисленное значение для ключа.Затем вы получаете доступ к table.getValueAt (...), у вас есть доступ к объекту, который содержит обе части информации.

Вот пример отдельного комбинированного окна:

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

}
1 голос
/ 14 января 2018

У меня есть отличное и умное решение:

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

Я установил модель для rolComboBox с вектором с пользовательским объектом, объект resultSet содержит все данные из базы данных. После того, как я хочу получить идентификатор из comboBox, получите его методом getSelectedItem.

System.out.println("Rol Selected: "+ ((Roles)rolComboBox.getSelectedItem()).getId());
0 голосов
/ 31 января 2011

Поскольку автоматического способа сделать это не существует :(. Я использую карту, чтобы сохранить свои значения и ключ.

private TreeMap <Integer, String> categoryMap = new TreeMap<Integer, String>();
private JComboBox comboCategory = new JComboBox();

Получить все категории (ключ, значение) и заполнить карту и комбо

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();
        }
    }

Четвертый столбец моего JTable должен быть комбобоксом

// set the fourth column as combo
            TableColumn categoryColumn = tableData.getColumnModel().getColumn(4);
            categoryColumn.setCellEditor(new DefaultCellEditor(comboCategory));

При редактировании значения в выпадающем списке он показывает текст, но для обновления значения в таблице базы данных мне нужно получить целочисленный ключ.

// 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);
                    }   

Для обновления базы данных,

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

А вот и getKeyForValue,

private int getKeyForValue(String value) {
    for (Entry<Integer, String> entry : categoryMap.entrySet()) {
         if (entry.getValue().equals(value)) {
             return entry.getKey();
         }
     }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...