JList - вопрос дизайна относительно представления toString () - PullRequest
2 голосов
/ 14 апреля 2011

Я работаю с JList и столкнулся с несколькими проблемами проектирования.то, что я хочу, это графический компонент, который представляет список и позволяет пользователю добавлять или удалять значения из него.

Итак, я создал класс, который получает список

List<? exteds IDisplayable> 
  • IDisplayable - это простой интерфейс с функцией String DisplayString ().каждый объект, который хочет отображаться в списке, должен реализовывать IDIsplayable.

Когда загружается форма GUI, я перебираю список и выполняю

MylistModel.addElement(iDisplayable.getDisplayString()

Это потому, что я не хочу, чтобы он отображал toString ().Поэтому я добавил метод.

Теперь мой вопрос - как вернуть список в форму графического интерфейса, которая его вызвала?Должен ли я повторить и сравнить по имени?Это звучит ужасно.

Мне нужно поместить объект ListModel в мой объект, но отобразить другую строку toString.Должен ли я создать новую модель списка?Я даже не могу расширить AbstractListModel, потому что он использует toString.
Это единственное решение?

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Как уже упоминалось, xxRenderer - это соавтор, который принимает решение обо всем визуальном представлении элемента, отображаемого в «компоненте коллекции» (например, JList, JTable и т. Д.).Когда вы привязаны к базовой поддержке Swing, вам нужно реализовать пользовательский рендер.SwingX поддерживает более легкий подход, позволяя подключать отображение строк (и визуальные декорации, но это не та история): реализовать пользовательское StringValue (SwingX говорят для преобразования строк) и передать его в средство визуализации SwingX, например

StringValue sv = new StringValue() {
      @Override
      public String getString(Object value) {
          if (value instanceof MyObject) {
              return .... // use MyObject properties to build a suitable rep
          }
          return TO_STRING.getString(value);
      }    
}
list.setCellRenderer(new DefaultListRenderer(sv));
// a bit of beauty: same rep is re-usable in other collection components
table.setCellRenderer(MyObject.class, new DefaultTableRenderer(sv);
comboBox.setRenderer(list.getCellRenderer());
tree.setTreeCellRenderer(new DefaultTreeRenderer(sv));

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

1 голос
/ 14 апреля 2011

Вы можете создать объект-оболочку, который содержит объект IDisplayable и реализует метод toString (), который просто вызывает getDisplayString () для IDisplayable. Может быть, это не так приятно, но может быть лучше, чем создание собственной модели списка.

Редактировать: Не уверен, почему это не возникло вначале. Но похоже, что ListCellRenderer действительно то, что вам нужно: http://download.oracle.com/javase/tutorial/uiswing/components/list.html

0 голосов
/ 14 апреля 2011

Должен ли я повторить и сравнить по имени?звучит ужасно.

Это ужасно.Вы можете запросить индекс выбранного элемента, поэтому вам не нужно сравнивать, но вы можете сразу же получить нужный объект.Вопрос в том, достаточно ли хорош этот быстрый и грязный подход.Как вы уже упоминали, новая модель списка будет «чистым» решением.

...