Изменение модели JComboBox с отменой ListModel. Есть ли у него скрытые последствия?

Я использую JList и JComboBox в разных местах. Содержание обоих динамически меняется.

После создания comboBox вы не можете просто сказать comboBox.setModel(String[]), вам нужно создать новую модель, а затем установить ее в comboBox.

То же самое происходит с JList.

Вместо того, чтобы создавать свои собственные Jlist и ComboBox только для добавления нового метода с именем .setNewModel(String[]), я создал статический метод в своем «служебном» классе, который получает String[] и возвращает ListModel.

Итак, я могу сделать это:

someComboBox.setModel((ComboBoxModel)UtilityClass.convetToListModel(aStringArray));

Я использую то же самое для JList.

someList.setModel(UtilityClass.convetToListModel(anotherStringArray));

мой вопрос:

Может ли приведение listModel к ComboBoxModel иметь неожиданные последствия? Если да, то можно ли изменить все содержимое comboBox без необходимости преобразования ArrayString в модель?

вот код метода:

public static ListModel convertToListModel(String[] nList)
{
    return (new JComboBox(nList).getModel());
}

Программа компилируется и работает нормально, но кастинг всегда вызывает у меня сомнения, особенно сложные объекты. Да, я знаю, что могу расширить JComboBox и JList, чтобы добавить метод, который выполняет эту работу, но это требует много дополнительной работы. Почему ComboBox и Jlist не обновляют или не изменяют модель, чем принимают простой массив строк?


person rciafardone    schedule 06.05.2011    source источник


Ответы (3)


Как

someComboBox.setModel((ComboBoxModel)UtilityClass.convetToListModel(aStringArray));

в любом случае проще написать/проще/что угодно, чем

someComboBox.setModel(new DefaultComboBoxModel(aStringArray))

все, что вы добавили, это белый шум в виде метода Utility. Плюс

  • реализация этого метода просто... безумна: вы создаете JComboBox только для того, чтобы получить доступ к модели, созданной внутри этого комбо...
  • вам нужно использовать реализацию для приведения типов для использования в реальном комбо...

Не делайте таких расточительных / ненужных вещей, даже не думайте идти в обход, когда есть простой и прямой способ достичь той же цели.

person kleopatra    schedule 06.05.2011
comment
Спасибо. Я полностью игнорирую эту модель ComboBoxModel по умолчанию. Первое, что я попробовал, было почти именно так, но с ComboBoxModel я получил ошибку, что это было абстрактно, и сделал все это (теперь) сумасшедшим обходным путем. Очищаем код прямо сейчас. - person rciafardone; 06.05.2011

Если содержимое списка/поля со списком должно динамически изменяться, вам следует напрямую управлять самой моделью. Не стоит каждый раз создавать новую модель и заменять старую. Весь смысл наличия модели в том, что вы можете обновлять содержащиеся в ней данные.

Просто создайте свой собственный DefaultListModel или DefaultComboBoxModel и передайте его в JList/JComboBox. Затем используйте методы добавления/удаления модели по мере необходимости для обновления содержимого при его изменении.

private DefaultComboBoxModel model = new DefaultComboBoxModel();
private JComboBox combo = new JComboBox(model);
...

model.addElement(somethingForMyList);
...
model.removeAllElements();
...
model.removeElement(elementToRemove);
person wolfcastle    schedule 06.05.2011
comment
Спасибо, но это означало бы добавление одного элемента за раз с использованием цикла для чтения массива, чего я не хотел делать. Вот почему я разместил вопрос, я знал, что должен существовать более простой способ, но не сделал правильный поиск. Еще раз спасибо. - person rciafardone; 06.05.2011
comment
Это довольно странно, когда вы устанавливаете модель, это экземпляр DefaultComboBoxModel, но когда вы делаете combo.getModel(), это экземпляр ComboBoxModel, и вы не можете просто addElement(e). Я так понимаю, он защищен? - person WesternGun; 03.08.2016

Обычно я бы предпочел реализовать новый класс, унаследованный от DefaultComboBoxModel (поэтому это также ListModel, а также ComboBoxModel). Этот новый класс будет обогащен методами для обновления модели в соответствии с требованиями любой возможной ситуации. В методах обновления вы должны вызвать fireContentsChanged, чтобы сообщить окружающему компоненту, что содержимое изменилось, и компонент должен все перерисовать.

Надеюсь, поможет.

person Osiris76    schedule 06.05.2011
comment
Это было бы излишним, и именно этого я хотел избежать, поскольку мне не нужны никакие дополнительные функции, все мои проблемы связаны с отсутствием прямого способа установить мой arrayString в модели за один шаг. defaultComboBoxModel разрешает это. Невежество съедает меня. - person rciafardone; 06.05.2011