Изменение полей со списком (Swing) (Java)

521
04 марта 2017, 03:05

Суть :

Не получается присвоить "кнопке-список" список своих элементов

Есть

ArrayList<String> users = new ArrayList();

также есть строка в классе с GUI

jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));

работаю в NetBeans,не удается с присвоить кнопке со списком свой список. На зарубежных интернетах нашел такое:

jComboBox1.removeAllItems();
    for (int i = 0; i <  users.size(); i++) {
     jComboBox1.addItem(users.get(i));
    }

ПРОБЛЕМЫ ПРИКРЕПЛЕННЫХ НИЖЕ ОТВЕТОВ :

     jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
        jComboBox1.removeAllItems();
        String [] items = new String [10];
        for (int i = 0; i < new ListFriend().nameSurname.size(); i++) {
        items[i] = new ListFriend().nameSurname.get(i);
      }
      jComboBox1.setModel(new javax.swing.DefaultComboBoxModel<>(items));

в итоге элементы-то я получил,но они не отображаются. В чём причина?

   jComboBox1.setModel(myModel);
    myModel.add("Hello");
    myModel.add("Hel23lo");
    myModel.add("Hell3wso");
    for (int i = 0; i < new ListFriend().nameSurname.size(); i++) {
    String r = new ListFriend().nameSurname.get(i);
    myModel.add(r);
    }  

если попробовать так то тоже не работает,он не закидывает элементы массива в список,кроме тех,которые были добавлены через просто myModel.add он не дает возможность добавлять через цикл.

если написать даже так :

    for (int i = 0; i < 5; i++) {
    String r = "hello world";
    new MyModel().add(r);
    }

он всё равно не будет добавлять их.

Answer 1

Есть несколько способов динамически добавлять в JComboBox элементы. Самым правильным способом будет создать объект реализующий интерфейс ComboBoxModel и передать его в JComboBox.

После этого добавление и удаление элементов нужно делать в этом объекте, а JComboBox будет отображать изменения автоматически.

Вот простой вариант реализации для хранения строк (String).

public class MyModel extends AbstractListModel<String> implements ComboBoxModel<String> {
    private List<String> list;
    private String selected;
    public MyModel() {
        list = new ArrayList<>();
    }
    public void remove(String item) {
        list.remove(item);
        fireContentsChanged(this, 0, list.size());
    }
    public void add(String item) {
        list.add(item);
        fireContentsChanged(this, 0, list.size());
    }
    @Override
    public int getSize() {
        return list.size();
    }
    @Override
    public String getElementAt(int index) {
        return list.get(index);
    }
    @Override
    public void setSelectedItem(Object item) {
        selected = (String) item;
    }
    @Override
    public Object getSelectedItem() {
        return selected;
    }
}

Использовать это так. Создание:

MyModel myModel = new MyModel();
JComboBox<String> = new JComboBox<>(myModel);

Добавление/удаление элементов:

myModel.add("hello");
myModel.add("world");
myModel.remove("hello");
// добавить элементы в цикле
// поскольку мы храним строки, то при добавлении элемента его необходимо привести типу String
for(int i = 0 ; i < 10 ; i++) {
    myModel.add("" + i); // сложение с пустой строкой один из способов приведения к String
}

Если у вас есть готовый список строк, то его можно добавить вот так

List<String> r = new ArrayList<>();
// предположим, что тут r заполняется значениями
// добавляем значения в ComboBox
for(String i: r) {
    myModel.add(i);
}

Вот тут можно найти рабочий пример приложения - SimpleMVC, правда там я использую JList, но принцип такой же.

Answer 2

Если про javax.swing.JComboBox<E> речь, то он в конструкторе массив принимает JComboBox(E[] items) Creates a JComboBox that contains the elements in the specified array.

String[] items = {
"item1",
"item2",
"item3"
};
JComboBox comboBox = new JComboBox(items);
READ ALSO
Добавление элемента в массив с циклом

Добавление элемента в массив с циклом

Есть такая конструкция

296
Ошибка: Index out of range

Ошибка: Index out of range

Что не так с кодом?

351
textArea.getDocument().addDocumentListener

textArea.getDocument().addDocumentListener

ЗдравствуйтеСтолкнулся с такой проблемой, у меня при инитиализации приложения создается DocumentListener, который отвечает за подсветку синтаксика,...

308