Изменение модели JComboBox без использования ListModel. Есть ли у него скрытые последствия? - PullRequest
2 голосов
/ 06 мая 2011

Я использую 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 не имеют обновления или модификации Model, кроме как для принятия простого массива Strings?

Ответы [ 3 ]

5 голосов
/ 06 мая 2011

Как это

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

проще писать / проще / чем угодно

someComboBox.setModel(new DefaultComboBoxModel(aStringArray))

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

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

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

3 голосов
/ 06 мая 2011

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

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

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

model.addElement(somethingForMyList);
...
model.removeAllElements();
...
model.removeElement(elementToRemove);
0 голосов
/ 06 мая 2011

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

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

...