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.
Google Guava
1) Download or clone this repository. 2) mvn install 3) Add the below block to your pom.xml
<dependency>
<groupId>org.leumasjaffe</groupId>
<artifactId>observable</artifactId>
</dependency>
``` 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);
} } ```