我按照Presentation Model模式编写了一些屏幕。
ArrayList
JTable
AbstractTableModel
中显示此列表的内容
如何在我的列表中管理添加{一个或多个} /删除{一个或多个}并在所有地方“实时”查看更改?
我即将编写自己的ObservableList或围绕EventDispatcher实现...你怎么看?
PS:
BindingList
有助于达到这个目的,Java呢?PropertyChangeSupport
,我已经能够显示每个bean的更新。 答案 0 :(得分:4)
让你的AbstractTableModel
实现ListModel
,它可以同时用于JComboBox and
JList。您可以根据需要将方法转发到默认模型实现。
附录:SharedModelDemo
中提到的How to Use Tables是一个可以帮助您入门的示例。它是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);
}
});
}
}
答案 1 :(得分:2)
对于JComboBox和JList,您可以使用subList()方法简单地引用ArrayList的各个部分。如果您可以轻松识别ArrayList中的起始位置和结束位置,并且所需的元素是连续的,那么这将起作用。
如果情况比动态更动态,您可以实现在构造函数中获取ArrayList的自定义List类,然后应用返回相应记录所需的任何逻辑。