# Observable - Disjoint UI updates for complex objects
This library exists to combine together two objectives in updating UI objects:
1) Be able to 'remotely' notify UI objects about updates without having to iterate through the entire component tree.
2) Allow editting of a shared resource from multiple potential call sites without needing a controller object that holds references to every single interested view.
This is a useful construct in the situation where you have a large number of fixed GUI components in a program (for example, rendering the various statistics of a Dungeons and Dragons (c) character), because the connections are made anonymously.
## Requirements
- Java 7
- org.leumasjaffe.event
- Google Guava
## Installation
### Steps
1. Download or clone this repository.
2. Open a console window in the directory
3. `mvn install`
4. Add the below block to your pom.xml
### Maven Artifact
``` xml
org.leumasjaffe
observable
```
## Example Code Snippets
### ObservableListener
``` java
class SpellBook extends Observable {
int spellSlotsRemaining, maxSpellSlots;
List> spellsAtLevel;
}
class SpellBookUI extends JPanel {
ObservableListener listener;
SpellBookUI(SpellBook model) {
JTextField spellsRemaining = new JTextField();
add(spellsRemaining);
// Set up a listener to anonymously update when model changes
listener = new ObservableListener<>(spellsRemaining, (text, book) -> {
text.setText(book.getSpellSlotsRemaining());
});
// Automatically invokes callback, setting the text field
listener.setObserved(model);
}
}
class CastSpellCommand {
SpellBook book;
void cast(Spell spell) {
// ...
--book.spellSlotsRemaining;
// Will automatically invoke the code in the ObservableListener above
ObserverDispatch.notifySubscribers(book);
}
}
```