Как объединить 2 вектора в JList? - PullRequest
0 голосов
/ 22 февраля 2011
Vector<String> totalProducts = Products.getProductNames();
Vector<String> selectedProducts = Products.getSelectedProductNames();

Вектор selectedProducts является подвектором totalProducts (это означает, что selectedProducts содержит один, несколько или все элементы из totalProducts ). То, что я хочу, это объединить эти два вектора и создать один JList , который содержит все элементы из totalProducts, а уже с элементами selectedProducts selected .

Что я пробовал:

    Vector<Integer> indices = new Vector<Integer>();
    JList prdList = new JList(totalProducts);
    for(int i = 0; i < totalProducts.size(); i++)
    {
        for(String name : selectedProducts)
        {
            if(totalProducts.contains(name)) indices.add(i);
        }
    }
    Object [] objIndices = indices.toArray();
    //... Cast from Object [] to int [] ....
    prdList.setSelectedIndices(intIndices);

... но при этом выбираются все элементы в конечном JList.

Ранее я пробовал:

    JList prdList = new JList(totalProducts);
    for(String tName : totalProducts)
    {
        for(String sName : selectedProducts)
        {
            if(totalProducts.contains(sName)) prdList.setSelectedValue(sName, false);
        }
    }

... но этот выбрал только последний элемент из выбранных продуктов.

Не могли бы вы помочь мне сделать это правильно?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

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

for(int i = 0; i < totalProducts.size(); i++)
{
    String name = totalProducts.get(i);
    if(selectedProducts.contains(name)) indices.add(i);
}
1 голос
/ 22 февраля 2011

при отладке вашей первой попытки (которая выглядит так, как будто должна работать, каково содержимое вашего массива intIndices? Потому что, похоже, он должен работать, предполагая, что преобразование массива работает.

однако, поскольку selectedproducts гарантированно будет меньше элементов, чем общее количество, вы можете вместо этого повторить?

List<Integer> indices = new ArrayList<Integer>(selectedProducts.size());    
for(String name : selectedProducts)
{
    int index = totalProducts.indexOf(name);
    if (index != -1)
        indices.add(index);        
}

, хотя, поскольку indexOf - это линейный поиск в списке, вероятно,не имеет большого значения в любом случае.

Что касается вашей второй попытки, ListSelectionModel имеет методы для добавления выбранного индекса (addSelectionInterval(int index0, int index1)), вы используете тот устанавливает (перезаписывает) выделение.

см. http://download.oracle.com/javase/6/docs/api/javax/swing/ListSelectionModel.html

в стороне: вы можете использовать List<> вместо Vector<>, поскольку вектор имеетмного ненужных накладных расходов на синхронизацию. Если не требуется синхронизация ....

редактировать исправлено копирование + вставка add (i) с add (index)

...