Лучший способ связать данные и элементы ComboBox - PullRequest
0 голосов
/ 01 октября 2019

У меня возникают трудности при создании JComboBox, который будет использоваться для фильтрации и выбора определенного пользовательского объекта данных, который извлекается из внутренней структуры данных, и значение, показанное в JComboBox, будет просто значением одного поля в этом пользовательскомобъект данных или даже поле поля (то есть сам пользовательский объект) включающего пользовательского объекта данных. Например, у меня есть форма регистрации модели устройства.

https://drive.google.com/open?id=1q-_ii_V7SWDBFvUJGw0cd2BEWP3BnM0H

Модель имеет имя, спецификацию, тип устройства и производителя, которые его определяют. Это фактический класс Model, который я использую:

public class Models
{
    private DeviceTypes deviceType;
    private Manufacturers manufacturer;
    private String name;

    //getters and setters
}

Это еще одна часть HashMap, которая содержит все Модели с их идентификатором.

public Map<Integer,Models> modelsTable = new HashMap<Integer, Models>();

Я хочу иметь возможность добавитьи удалить элементы из JComboBox и выбрать фактические данные, объединенные с элементами JComboBox, для создания новых моделей с этими объектами. Какой стандартный способ сделать это? Я создал средство визуализации ComboBox:

public class DeviceTypeRenderer extends BasicComboBoxRenderer
{
    private static final long serialVersionUID = 3442865560696889757L;

    public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        if (value instanceof DeviceTypes)
        {
            value = ((DeviceTypes)value).getName();
        }

        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        return this;
    }
}

public class ManufacturersRenderer extends BasicComboBoxRenderer
{
    private static final long serialVersionUID = 3723328665061573656L;

    public Component getListCellRendererComponent(JList<?> list, Object value,int index, boolean isSelected, boolean cellHasFocus)
    {
        if (value instanceof Manufacturers)
        {
            value = ((Manufacturers)value).getName();
        }

        super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);

        return this;
    }
}

И затем я просто добавляю или удаляю их как объекты данных.

DeviceTypes deviceType = new DeviceTypes(name,description);

comboBoxDeviceType.addItem(deviceType);

И JComboBox отображает deviceType.getName();

Чтобудет лучшим способом сделать обратное. Чтобы получить актуальный класс данных формы выбора элемента JComboBox? Я, вероятно, сделал все это неправильно и использую много плохой практики. Если вы видите это, пожалуйста, сообщите мне, чтобы исправить себя, и я был бы признателен, если бы вы могли показать мне, как реализовать это правильно. Заранее спасибо!

...