?? jlistbinding.java
字號:
private boolean isListAccessible(Object value) {
return value != null && value != PropertyStateEvent.UNREADABLE;
}
private void cleanupForLast() {
if (list == null) {
return;
}
resetListSelection();
list.setModel(new DefaultListModel());
list = null;
model.setElements(null, true);
model = null;
}
/**
* Creates a {@code DetailBinding} and sets it as the {@code DetailBinding}
* for this {@code JListBinding}. A {@code DetailBinding} specifies the property
* of the objects in the source {@code List} to be used as the elements of the
* {@code JList}. If the {@code detailProperty} parameter is {@code null}, the
* {@code DetailBinding} specifies that the objects themselves be used.
*
* @param detailProperty the property with which to derive each list value
* from its corresponding object in the source {@code List}
* @return the {@code DetailBinding}
*/
public DetailBinding setDetailBinding(Property<E, ?> detailProperty) {
return setDetailBinding(detailProperty, null);
}
/**
* Creates a named {@code DetailBinding} and sets it as the {@code DetailBinding}
* for this {@code JListBinding}. A {@code DetailBinding} specifies the property
* of the objects in the source {@code List} to be used as the elements of the
* {@code JList}. If the {@code detailProperty} parameter is {@code null}, the
* {@code DetailBinding} specifies that the objects themselves be used.
*
* @param detailProperty the property with which to derive each list value
* from its corresponding object in the source {@code List}
* @return the {@code DetailBinding}
*/
public DetailBinding setDetailBinding(Property<E, ?> detailProperty, String name) {
throwIfBound();
if (name == null && JListBinding.this.getName() != null) {
name = JListBinding.this.getName() + ".DETAIL_BINDING";
}
detailBinding = detailProperty == null ?
new DetailBinding(ObjectProperty.<E>create(), name) :
new DetailBinding(detailProperty, name);
return detailBinding;
}
/**
* Returns the {@code DetailBinding} for this {@code JListBinding}.
* A {@code DetailBinding} specifies the property of the source {@code List} elements
* to be used as the elements of the {@code JList}.
*
* @return the {@code DetailBinding}
* @see #setDetailBinding(Property, String)
*/
public DetailBinding getDetailBinding() {
return detailBinding;
}
private final Property DETAIL_PROPERTY = new Property() {
public Class<Object> getWriteType(Object source) {
return Object.class;
}
public Object getValue(Object source) {
throw new UnsupportedOperationException();
}
public void setValue(Object source, Object value) {
throw new UnsupportedOperationException();
}
public boolean isReadable(Object source) {
throw new UnsupportedOperationException();
}
public boolean isWriteable(Object source) {
return true;
}
public void addPropertyStateListener(Object source, PropertyStateListener listener) {
throw new UnsupportedOperationException();
}
public void removePropertyStateListener(Object source, PropertyStateListener listener) {
throw new UnsupportedOperationException();
}
public PropertyStateListener[] getPropertyStateListeners(Object source) {
throw new UnsupportedOperationException();
}
};
/**
* {@code DetailBinding} represents a binding between a property of the elements
* in the {@code JListBinding's} source {@code List}, and the values shown in
* the {@code JList}. Values in the {@code JList} are aquired by fetching the
* value of the {@code DetailBinding's} source property for the associated object
* in the source {@code List}.
* <p>
* A {@code Converter} may be specified on a {@code DetailBinding}. Specifying a
* {@code Validator} is also possible, but doesn't make sense since {@code JList}
* values aren't editable.
* <p>
* {@code DetailBindings} are managed by their {@code JListBinding}. They are not
* to be explicitly bound, unbound, added to a {@code BindingGroup}, or accessed
* in a way that is not allowed for a managed binding.
*
* @see org.jdesktop.swingbinding.JListBinding#setDetailBinding(Property, String)
*/
public final class DetailBinding extends AbstractColumnBinding {
private DetailBinding(Property<E, ?> detailProperty, String name) {
super(0, detailProperty, DETAIL_PROPERTY, name);
}
}
private class Handler implements PropertyStateListener {
public void propertyStateChanged(PropertyStateEvent pse) {
if (!pse.getValueChanged()) {
return;
}
if (pse.getSourceProperty() == listP) {
cleanupForLast();
boolean wasAccessible = isListAccessible(pse.getOldValue());
boolean isAccessible = isListAccessible(pse.getNewValue());
if (wasAccessible != isAccessible) {
elementsP.setAccessible(isAccessible);
} else if (elementsP.isAccessible()) {
elementsP.setValueAndIgnore(null, null);
}
} else {
if (((ElementsProperty.ElementsPropertyStateEvent)pse).shouldIgnore()) {
return;
}
if (list == null) {
list = listP.getValue(getTargetObject());
resetListSelection();
model = new BindingListModel();
list.setModel(model);
} else {
resetListSelection();
}
model.setElements((List)pse.getNewValue(), true);
}
}
}
private void resetListSelection() {
ListSelectionModel selectionModel = list.getSelectionModel();
selectionModel.setValueIsAdjusting(true);
selectionModel.clearSelection();
selectionModel.setAnchorSelectionIndex(-1);
selectionModel.setLeadSelectionIndex(-1);
selectionModel.setValueIsAdjusting(false);
}
private final class BindingListModel extends ListBindingManager implements ListModel {
private final List<ListDataListener> listeners;
public BindingListModel() {
listeners = new CopyOnWriteArrayList<ListDataListener>();
}
protected AbstractColumnBinding[] getColBindings() {
return new AbstractColumnBinding[] {getDetailBinding()};
}
protected void allChanged() {
contentsChanged(0, size());
}
protected void valueChanged(int row, int column) {
contentsChanged(row, row);
}
protected void added(int index, int length) {
assert length > 0; // enforced by ListBindingManager
ListDataEvent e = new ListDataEvent(this, ListDataEvent.INTERVAL_ADDED, index, index + length - 1);
for (ListDataListener listener : listeners) {
listener.intervalAdded(e);
}
}
protected void removed(int index, int length) {
assert length > 0; // enforced by ListBindingManager
ListDataEvent e = new ListDataEvent(this, ListDataEvent.INTERVAL_REMOVED, index, index + length - 1);
for (ListDataListener listener : listeners) {
listener.intervalRemoved(e);
}
}
protected void changed(int row) {
contentsChanged(row, row);
}
private void contentsChanged(int row0, int row1) {
ListDataEvent e = new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, row0, row1);
for (ListDataListener listener : listeners) {
listener.contentsChanged(e);
}
}
public Object getElementAt(int index) {
return valueAt(index, 0);
}
public void addListDataListener(ListDataListener l) {
listeners.add(l);
}
public void removeListDataListener(ListDataListener l) {
listeners.remove(l);
}
public int getSize() {
return size();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -