README.md 1.8 KB

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) mvn install 3) Add the below block to your pom.xml

    Maven Artifact

    <dependency>
    <groupId>org.leumasjaffe</groupId>
    <artifactId>observable</artifactId>
    </dependency>
    

    Example Code Snippets

    ``` 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);
    

    } } ```