Использовать список строк в качестве источника поля со списком - PullRequest
7 голосов
/ 21 февраля 2010

Я хотел использовать список строк в качестве источника различных опций в jComboBox в Java. Можете ли вы сказать, какой метод использовать

Спасибо

Ответы [ 6 ]

6 голосов
/ 21 февраля 2010

См. Ниже мой ответ ... примите во внимание, что это не проверено и является просто примером.

Вам нужно создать собственную реализацию ComboBoxModel, как сказал Чандру: Затем установите ComboBoxModel на JComboBox с помощью метода setModel() и добавьте элементы с помощью ((CustomComboBoxModel<String>)jComboBox.getModel()).add(listOfThings); Как то так:

import java.util.List;
import javax.swing.ComboBoxModel;

/**
 * Custom Implementation of {@code ComboBoxModel} to allow adding a list of
 * elements to the list.
 */
public interface CustomComboBoxModel<T> extends ComboBoxModel {

    void add(List<T> elementsToAdd);

    List<T> getElements();

}

и затем реализовать интерфейс, используя что-то вроде этого:

import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractListModel;

/**
 * Default Implementation of CustomComboBoxModel - untested.
 */
public class DefaultCustomComboBoxModel<T> extends AbstractListModel implements CustomComboBoxModel<T> {

    List<T> objects;
    T selectedObject;

    /**
     * Constructs an empty DefaultCustomComboBoxModel object.
     */
    public DefaultCustomComboBoxModel() {
        objects = new ArrayList<T>();
    }

    /**
     * Constructs a DefaultCustomComboBoxModel object initialized with
     * an array of objects.
     *
     * @param items  an array of Object objects
     */
    public DefaultCustomComboBoxModel(final T items[]) {
        objects = new ArrayList<T>();

        int i, c;
        for (i = 0, c = items.length; i < c; i++) {
            objects.add(items[i]);
        }

        if (getSize() > 0) {
            selectedObject = objects.get(0);
        }
    }

    // implements javax.swing.ComboBoxModel
    /**
     * Set the value of the selected item. The selected item may be null.
     * Make sure {@code anObject} is an instance of T otherwise a
     * ClassCastException will be thrown.
     * <p>
     * @param anObject The combo box value or null for no selection.
     */
    @Override
    public void setSelectedItem(Object anObject) {
        if ((selectedObject != null && !selectedObject.equals(anObject))
                || selectedObject == null && anObject != null) {
            selectedObject = (T) anObject;
            fireContentsChanged(this, -1, -1);
        }
    }

    // implements javax.swing.ComboBoxModel
    @Override
    public T getSelectedItem() {
        return selectedObject;
    }

    // implements javax.swing.ListModel
    @Override
    public int getSize() {
        return objects.size();
    }

    // implements javax.swing.ListModel
    @Override
    public T getElementAt(int index) {
        if (index >= 0 && index < objects.size()) {
            return objects.get(index);
        } else {
            return null;
        }
    }

    /**
     * Returns the index-position of the specified object in the list.
     *
     * @param anObject
     * @return an int representing the index position, where 0 is
     *         the first position
     */
    public int getIndexOf(T anObject) {
        return objects.indexOf(anObject);
    }

    // implements javax.swing.MutableComboBoxModel
    public void addElement(T anObject) {
        objects.add(anObject);
        fireIntervalAdded(this, objects.size() - 1, objects.size() - 1);
        if (objects.size() == 1 && selectedObject == null && anObject != null) {
            setSelectedItem(anObject);
        }
    }

    // implements javax.swing.MutableComboBoxModel
    public void insertElementAt(T anObject, int index) {
        objects.add(index, anObject);
        fireIntervalAdded(this, index, index);
    }

    // implements javax.swing.MutableComboBoxModel
    public void removeElementAt(int index) {
        if (getElementAt(index) == selectedObject) {
            if (index == 0) {
                setSelectedItem(getSize() == 1 ? null : getElementAt(index + 1));
            } else {
                setSelectedItem(getElementAt(index - 1));
            }
        }

        objects.remove(index);

        fireIntervalRemoved(this, index, index);
    }

    // implements javax.swing.MutableComboBoxModel
    public void removeElement(T anObject) {
        int index = objects.indexOf(anObject);
        if (index != -1) {
            removeElementAt(index);
        }
    }

    /**
     * Empties the list.
     */
    public void removeAllElements() {
        if (objects.size() > 0) {
            int firstIndex = 0;
            int lastIndex = objects.size() - 1;
            objects.clear();
            selectedObject = null;
            fireIntervalRemoved(this, firstIndex, lastIndex);
        } else {
            selectedObject = null;
        }
    }

    @Override
    public void add(List<T> elementsToAdd) {
        objects.addAll(elementsToAdd);
        fireContentsChanged(this, -1, -1);

    }

    @Override
    public List<T> getElements() {
        return objects;
    }
}
3 голосов
/ 21 февраля 2010

Расширить DefaultComboboxModel и создать метод, который принимает коллекцию и устанавливает элементы из этой коллекции. Установите эту пользовательскую модель как модель вашего комбинированного списка, используя setModel().

1 голос
/ 21 февраля 2010

Здесь у вас есть код, который создает поле со списком из массива строк, все что вам нужно сделать, это преобразовать ваш список в массив. String petStrings = ...;

//Create the combo box, select item at index 4.
//Indices start at 0, so 4 specifies the pig.
JComboBox petList = new JComboBox(petStrings.toArray());
0 голосов
/ 27 августа 2013

Вы также можете сделать это так:

 DefaultTableModel modelTabele = (DefaultTableModel) tblOsobe.getModel();
    modelTabele.addColumn("Ime");
    modelTabele.addColumn("Prezime");
    modelTabele.addColumn("Datum Rodjenja");

    for (Osoba osoba : Liste.osobe) {
        System.out.println("" + osoba);
        Object[] podaci = new Object[3];
        podaci[0] = osoba.getIme();
        podaci[1] = osoba.getPrezime();
        podaci[2] = osoba.getDatumRodjenja();
        modelTabele.addRow(podaci);

    }

Эта модель имеет 3 столбца и столько же строк, сколько в списке строк в Liste.osobe.

0 голосов
/ 11 сентября 2012

Я знаю, что это старый пост, но я хотел сделать небольшое дополнение к DefaultCustomComboBoxModel от Edwardsmatt. Не забудьте добавить этот конструктор:

public DefaultCustomComboBoxModel(List<T> list) {
    objects = list;

    if (getSize() > 0) {
        selectedObject = objects.get(0);
    }
}

, чтобы модель также можно было инициализировать списком, например,

myCombo.setModel(new DefaultCustomComboBoxModel(myList));

Если вы используете ((CustomComboBoxModel)myCombo.getModel()).add(myList), вам нужно явно установить выбранный элемент.

0 голосов
/ 23 февраля 2010

Самый простой способ:

comboBox.setModel(new DefaultComboBoxModel(list.toArray()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...