Как использовать элемент Карты в качестве текста JComboBox

Я заполняю JComboBox (использование addItem()) со всеми элементами набора. Каждый элемент в наборе является a HashMap (таким образом, это - ComboBox Hashmaps..).

Мой вопрос - Учитывая, что мне нужен каждый объект, чтобы быть a HashMap как я устанавливаю текст для появлений в поле комбинированного списка на GUI? Это должно быть значение определенного ключа в карте. Обычно, если я заполняю поле комбинированного списка со своим собственным типом, я был бы просто сверхъязь toString() метод..., но я не уверен, как достигнуть этого, так как я использую Java HashMap.

Какие-либо идеи (если это возможно, не реализовывая мой собственный HashMap)?

Обновление: Это походит, там не должен так или иначе стараться не иметь объектный интервал сверхъязь JComboBox toString (), если я хочу пользовательскую функциональность.. Мне жаль, что не было способа (1) указать объекты, которые будут загружены в JComboBox и (2) указать, как эти объекты состоят в том, чтобы появиться в GUI.

10
задан llm 11 May 2010 в 17:23
поделиться

3 ответа

(2) укажите, как эти объекты должны быть отображаются в графическом интерфейсе.

Можно добавить в модель любой объект Object, а затем создать пользовательский рисудер для отображения объекта любым нужным способом. Простой пример, в которого показан подход toString() и пользовательский подход к подготовке к рендерингу:

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

        JComboBox comboBox;

        //  Easiest approach is to just override toString() method
        //  of the Item class

        comboBox = new JComboBox( model );
        comboBox.setDragEnabled(true);
        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.setDragEnabled(true);
        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 );
     }

}
11
ответ дан 4 December 2019 в 01:00
поделиться

Если у вас есть хэш-карта, вы захотите сделать что-то вроде:

JComboBox box = new JComboBox(hashMap.getValues().toArray());

Конечно, вы должны переопределить метод toString объекта, который у вас есть в HashMap

0
ответ дан 4 December 2019 в 01:00
поделиться

Если вы хотите переопределить метод toString () , вы можно просто создать класс декоратора, который реализует Map и использует HashMap для реализации необходимых методов и дает вашу собственную реализацию toString () .

0
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: