Как связать список (один или несколько раз)? - PullRequest
4 голосов
/ 27 сентября 2011

Я следую шаблону Presentation Model для кодирования некоторых экранов.

  • Я храню некоторые Бобы в ArrayList
  • Я буду отображать содержимое этого списка в JTable, благодаря AbstractTableModel
  • Я также хочу отобразить некоторые записи из этого списка в поле со списком (в форме) и некоторые другие в JList, одновременно
  • Эти три экрана (и их модель) независимы друг от друга

Как управлять добавлением {одного или нескольких} / удалением {одного или нескольких} в мой список и везде просматривать изменения в режиме реального времени?

Я собираюсь написать свой собственный ObservableList или реализовать его вокруг EventDispatcher ... Что вы думаете?


PS:

  • Я знаю, что в C # BindingList помогает для этой цели, а как насчет Java?
  • Я уже могу отображать обновления каждого компонента, благодаря PropertyChangeSupport.

Ответы [ 2 ]

4 голосов
/ 27 сентября 2011

Позвольте вашему AbstractTableModel реализовать ListModel, который можно использовать с обоими JComboBox and JList. При необходимости вы можете перенаправить методы в реализации модели по умолчанию.

Приложение: SharedModelDemo, упомянутое в Как использовать таблицы , является примером, который может помочь вам начать работу. Это extends DefaultListModel implements TableModel, а вы должны сделать extends AbstractTableModel implements ListModel

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

public class SharedModel extends AbstractTableModel
        implements ComboBoxModel, ListModel {
    private ComboBoxModel comboModel = new DefaultComboBoxModel();
    private ListModel listModel = new DefaultListModel();

    //ComboBoxModel
    @Override
    public void setSelectedItem(Object anItem) {
        comboModel.setSelectedItem(anItem);
    }

    @Override
    public Object getSelectedItem() {
        return comboModel.getSelectedItem();
    }

    // ListModel
    @Override
    public int getSize() {
        return listModel.getSize();
    }

    @Override
    public Object getElementAt(int index) {
        return listModel.getElementAt(index);
    }

    @Override
    public void addListDataListener(ListDataListener l) {
        listModel.addListDataListener(l);
    }

    @Override
    public void removeListDataListener(ListDataListener l) {
        listModel.removeListDataListener(l);
    }

    // TableModel
    @Override
    public int getRowCount() {
        return 0;
    }

    @Override
    public int getColumnCount() {
        return 0;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        return null;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                SharedModel sm = new SharedModel();
                JTable table = new JTable(sm);
                JList list = new JList(sm);
                JComboBox check = new JComboBox(sm);
            }
        });
    }
}
2 голосов
/ 27 сентября 2011

Для JComboBox и JList вы можете просто ссылаться на разделы ArrayList, используя метод subList ().Это будет работать, если вы можете легко определить начальное и конечное местоположения в ArrayList, а необходимые вам элементы являются последовательными.

Если ситуация более динамична, чем вы могли бы реализовать пользовательские классы List, которые взяли ArrayList вконструктор, а затем применить любую логику, необходимую для возврата соответствующих записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...