Quellcode durchsuchen

Updating ObservableListener - compose not extend
Redundancy-ing away updateModel() completely. What components are not hooked up with an observablelistener simply directly attach to the values in setModel()

Sam Jaffe vor 9 Jahren
Ursprung
Commit
da2566a068

+ 3 - 1
src/org/leumasjaffe/charsheet/observer/IndirectObservableListener.java

@@ -8,9 +8,11 @@ import javax.swing.text.JTextComponent;
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
 import lombok.AccessLevel;
+import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
-@FieldDefaults(level=AccessLevel.PROTECTED, makeFinal=true)
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
+@Getter(value=AccessLevel.PACKAGE)
 @RequiredArgsConstructor
 public class IndirectObservableListener<T> {
 	JTextComponent text;

+ 4 - 4
src/org/leumasjaffe/charsheet/observer/ObservableController.java

@@ -28,18 +28,18 @@ public class ObservableController<T extends Observable> extends ObservableListen
 		super(text, stringify);
 		this.func = func;
 		AnyActionDocumentListener.emptyOrText( text, 
-				e -> onEmpty.accept( model ), 
+				e -> onEmpty.accept( impl.getModel() ), 
 				evt -> accept( ) );
 	}
 
 	private boolean update() {
-		return func.apply( text.getText( ), model );
+		return func.apply( impl.getText().getText( ), impl.getModel() );
 	}
 
 	private void accept() {
-		Objects.requireNonNull( model );
+		Objects.requireNonNull( impl.getModel() );
 		if ( update( ) ) {
-			ObserverDispatch.notifySubscribers( model, this );
+			ObserverDispatch.notifySubscribers( impl.getModel(), this );
 		}
 	}
 }

+ 9 - 3
src/org/leumasjaffe/charsheet/observer/ObservableListener.java

@@ -4,12 +4,18 @@ import java.util.function.Function;
 
 import javax.swing.text.JTextComponent;
 
-public class ObservableListener<T extends Observable> extends IndirectObservableListener<T> {
+import lombok.AccessLevel;
+import lombok.experimental.FieldDefaults;
+
+@FieldDefaults(level=AccessLevel.PROTECTED, makeFinal=true)
+public class ObservableListener<T extends Observable> {
+	IndirectObservableListener<T> impl;
+	
 	public ObservableListener(final JTextComponent text, final Function<? super T, String> stringify) {
-		super(text, stringify);
+		impl = new IndirectObservableListener<>(text, stringify);
 	}
 	
 	public void setObserved( T obs ) {
-		super.setObserved(obs, obs);
+		impl.setObserved(obs, obs);
 	}
 }

+ 25 - 30
src/org/leumasjaffe/charsheet/view/ClassTab.java

@@ -12,20 +12,17 @@ import org.leumasjaffe.charsheet.entity.DDCharacterClass;
 import java.awt.GridBagConstraints;
 import java.awt.Insets;
 
-@FieldDefaults(level=AccessLevel.PRIVATE)
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class ClassTab extends JPanel {
 	/**
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
 
-	DDCharacterClass model;
+	String title;
 	
-	JTextField name;
-	JTextField level;
-	
-	public ClassTab(DDCharacterClass cc) {
-		this.model = cc;
+	public ClassTab(DDCharacterClass model) {
+		this.title = model.getName();
 		
 		GridBagLayout gridBagLayout = new GridBagLayout();
 		gridBagLayout.columnWidths = new int[]{0, 0, 0};
@@ -34,33 +31,31 @@ public class ClassTab extends JPanel {
 		gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE};
 		setLayout(gridBagLayout);
 		
-		name = new JTextField();
-		name.setEditable(false);
-		GridBagConstraints gbc_name = new GridBagConstraints();
-		gbc_name.insets = new Insets(0, 0, 0, 5);
-		gbc_name.fill = GridBagConstraints.HORIZONTAL;
-		gbc_name.gridx = 0;
-		gbc_name.gridy = 0;
-		add(name, gbc_name);
-		name.setColumns(10);
+		JTextField nameField = new JTextField();
+		nameField.setEditable(false);
+		GridBagConstraints gbc_nameField = new GridBagConstraints();
+		gbc_nameField.insets = new Insets(0, 0, 0, 5);
+		gbc_nameField.fill = GridBagConstraints.HORIZONTAL;
+		gbc_nameField.gridx = 0;
+		gbc_nameField.gridy = 0;
+		add(nameField, gbc_nameField);
+		nameField.setColumns(10);
+		
+		JTextField levelField = new JTextField();
+		levelField.setEditable(false);
+		GridBagConstraints gbc_levelField = new GridBagConstraints();
+		gbc_levelField.fill = GridBagConstraints.HORIZONTAL;
+		gbc_levelField.gridx = 1;
+		gbc_levelField.gridy = 0;
+		add(levelField, gbc_levelField);
+		levelField.setColumns(10);
 		
-		level = new JTextField();
-		level.setEditable(false);
-		GridBagConstraints gbc_level = new GridBagConstraints();
-		gbc_level.fill = GridBagConstraints.HORIZONTAL;
-		gbc_level.gridx = 1;
-		gbc_level.gridy = 0;
-		add(level, gbc_level);
-		level.setColumns(10);
+		nameField.setText(model.getName());
+		levelField.setText(StringHelper.toString(model.getLevel()));
 	}
 	
 	@Override
 	public String getName() {
-		return this.model.getName();
-	}
-	
-	public void updateModel() {
-		name.setText(this.model.getName());
-		level.setText(StringHelper.toString(this.model.getLevel()));
+		return title;
 	}
 }

+ 7 - 13
src/org/leumasjaffe/charsheet/view/D20Sheet.java

@@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
 
 import lombok.AccessLevel;
+import lombok.NonNull;
 import lombok.SneakyThrows;
 import lombok.experimental.FieldDefaults;
 import lombok.experimental.NonFinal;
@@ -35,7 +36,7 @@ public class D20Sheet extends JFrame {
 	private static final long serialVersionUID = 1L;
 	ObjectMapper mapper = new ObjectMapper();
 	@NonFinal File currentlyOpenFile = null;
-	@NonFinal DDCharacter model = new DDCharacter();
+	@NonFinal @NonNull DDCharacter model = new DDCharacter();
 	@NonFinal boolean isDirty = false;
 
 	JTabbedPane tabbedPane;
@@ -100,7 +101,6 @@ public class D20Sheet extends JFrame {
 
 		// Set up post-GUI dependencies
 		setModel(model);
-		updateModel();
 	}
 
 	private void reorderTabs() {
@@ -136,19 +136,13 @@ public class D20Sheet extends JFrame {
 		}
 	}
 	
-	public void setModel(DDCharacter model) {
-		this.model = model;
-		this.summaryTab.setModel(model);
-		updateModel();
-	}
-	
-	
-	public void updateModel() {
+	private void setModel(DDCharacter model) {
 		classTabs.clear();
-		this.model.getClasses().stream().forEach(cc -> classTabs.add(new ClassTab(cc)));
+		this.model = model;
+		summaryTab.setModel(model);
+		model.getClasses().stream().forEach(cc -> classTabs.add(new ClassTab(cc)));
+		equipmentTab.setModel(model);
 		
 		reorderTabs();
-		this.summaryTab.updateModel();
-		this.classTabs.forEach(t -> t.updateModel());
 	}
 }

+ 0 - 6
src/org/leumasjaffe/charsheet/view/SummaryTab.java

@@ -179,11 +179,5 @@ public class SummaryTab extends JPanel {
 		this.resistancePanel.setModel(model);
 		this.healthLine.setModel(model.getHealth());
 	}
-	
-	public void updateModel() {
-		this.descriptionPanel.updateModel();
-		this.attackLine.updateModel();
-		this.resistancePanel.updateModel();
-	}
 
 }

+ 13 - 9
src/org/leumasjaffe/charsheet/view/summary/AttackLine.java

@@ -10,6 +10,7 @@ import javax.swing.border.LineBorder;
 import org.leumasjaffe.charsheet.entity.AbilityScores;
 import org.leumasjaffe.charsheet.entity.DDCharacter;
 import org.leumasjaffe.charsheet.entity.viewable.IntValue;
+import org.leumasjaffe.charsheet.observer.IndirectObservableListener;
 import org.leumasjaffe.charsheet.observer.ObservableListener;
 import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
 import org.leumasjaffe.charsheet.view.StringHelper;
@@ -41,6 +42,7 @@ public class AttackLine extends JPanel {
 	JTextField baseAttack;
 	JTextField grappleStrength;
 	
+	IndirectObservableListener<DDCharacter> gTtlObserver;
 	ObservableListener<IntValue> gStrObserver;
 
 	public AttackLine() {
@@ -225,6 +227,14 @@ public class AttackLine extends JPanel {
 		gbc_grappleMisc.gridy = 0;
 		add(grappleMisc, gbc_grappleMisc);
 		
+		gTtlObserver = new IndirectObservableListener<>(grappleTtl,
+				(v) -> {
+					final int bab = v.getBaseAttack();
+					final int str = AbilityScores.modifier(this.model.getAbilities().getBase().getStr().value());
+					final int size = v.getSize().value().modifier;
+					final int misc = 0;
+					return StringHelper.toString(bab + str + size + misc);
+				});
 		gStrObserver = new ObservableListener<>(grappleStrength, 
 				new AbilModStringify());
 	}
@@ -235,17 +245,11 @@ public class AttackLine extends JPanel {
 		final int size = this.model.getSize().value().modifier;
 		final int misc = 0;
 		this.baseAttack.setText(StringHelper.toString(bab));
-		gStrObserver.setObserved(model.getAbilities().getBase().getStr());
+		final IntValue str = model.getAbilities().getBase().getStr();
+		gTtlObserver.setObserved(model, str);
+		gStrObserver.setObserved(str);
 		this.grappleSize.setText(StringHelper.toString(size));
 		this.grappleMisc.setText(StringHelper.toString(misc));
 	}
-	
-	public void updateModel() {
-		final int bab = this.model.getBaseAttack();
-		final int str = AbilityScores.modifier(this.model.getAbilities().getBase().getStr().value());
-		final int size = this.model.getSize().value().modifier;
-		final int misc = 0;
-		this.grappleTtl.setText(StringHelper.toString(bab + str + size + misc));
-	}
 
 }

+ 32 - 34
src/org/leumasjaffe/charsheet/view/summary/DescriptionPanel.java

@@ -10,33 +10,35 @@ import javax.swing.border.TitledBorder;
 import org.leumasjaffe.charsheet.entity.DDCharacter;
 import org.leumasjaffe.charsheet.view.StringHelper;
 
+import lombok.AccessLevel;
+import lombok.experimental.FieldDefaults;
+
 import javax.swing.border.Border;
 import javax.swing.border.MatteBorder;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.Dimension;
 
+@FieldDefaults(level=AccessLevel.PRIVATE, makeFinal=true)
 public class DescriptionPanel extends JPanel {
 	/**
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	private JTextField name;
-	private JTextField level;
-	private JTextField height;
-	private JTextField gender;
-	private JTextField age;
-	private JTextField size;
-	private JTextField player;
-	private JTextField deity;
-	private JTextField alignment;
-	private JTextField race;
-	private JTextField skin;
-	private JTextField hair;
-	private JTextField eyes;
-	private JTextField weight;
-	
-	private DDCharacter model;
+	JTextField name;
+	JTextField level;
+	JTextField height;
+	JTextField gender;
+	JTextField age;
+	JTextField size;
+	JTextField player;
+	JTextField deity;
+	JTextField alignment;
+	JTextField race;
+	JTextField skin;
+	JTextField hair;
+	JTextField eyes;
+	JTextField weight;
 	
 	public DescriptionPanel() {
 		setMinimumSize(new Dimension(600, 120));
@@ -364,24 +366,20 @@ public class DescriptionPanel extends JPanel {
 	}
 	
 	public void setModel(DDCharacter model) {
-		this.model = model;
-	}
-
-	public void updateModel() {
-		this.name.setText(this.model.getName());
-		this.player.setText(this.model.getPlayer());
-		this.level.setText(this.model.getClassAndLevelString());
-		this.race.setText(this.model.getRace());
-		this.alignment.setText(StringHelper.toString(this.model.getAlignment()));
-		this.deity.setText(this.model.getDeity());
-		this.size.setText(StringHelper.toString(this.model.getSize()));
-		this.age.setText(StringHelper.toString(this.model.getAge(), -1));
-		this.gender.setText(StringHelper.toString(this.model.getGender()));
-		this.height.setText(this.model.getHeight());
-		this.weight.setText(StringHelper.toString(this.model.getWeight(), -1));
-		this.eyes.setText(this.model.getEyes());
-		this.hair.setText(this.model.getHair());
-		this.skin.setText(this.model.getSkin());
+		this.name.setText(model.getName());
+		this.player.setText(model.getPlayer());
+		this.level.setText(model.getClassAndLevelString());
+		this.race.setText(model.getRace());
+		this.alignment.setText(StringHelper.toString(model.getAlignment()));
+		this.deity.setText(model.getDeity());
+		this.size.setText(StringHelper.toString(model.getSize()));
+		this.age.setText(StringHelper.toString(model.getAge(), -1));
+		this.gender.setText(StringHelper.toString(model.getGender()));
+		this.height.setText(model.getHeight());
+		this.weight.setText(StringHelper.toString(model.getWeight(), -1));
+		this.eyes.setText(model.getEyes());
+		this.hair.setText(model.getHair());
+		this.skin.setText(model.getSkin());
 	}
 
 }

+ 87 - 94
src/org/leumasjaffe/charsheet/view/summary/ResistanceLine.java

@@ -10,6 +10,7 @@ import javax.swing.border.LineBorder;
 import org.leumasjaffe.charsheet.entity.AbilityScores;
 import org.leumasjaffe.charsheet.entity.DDCharacter;
 import org.leumasjaffe.charsheet.entity.viewable.IntValue;
+import org.leumasjaffe.charsheet.observer.IndirectObservableListener;
 import org.leumasjaffe.charsheet.observer.ObservableListener;
 import org.leumasjaffe.charsheet.observer.helper.AbilModStringify;
 import org.leumasjaffe.charsheet.view.StringHelper;
@@ -17,7 +18,6 @@ import org.leumasjaffe.graphics.NumberTextField;
 
 import lombok.AccessLevel;
 import lombok.experimental.FieldDefaults;
-import lombok.experimental.NonFinal;
 
 import java.awt.Font;
 import javax.swing.SwingConstants;
@@ -34,21 +34,14 @@ public class ResistanceLine extends JPanel {
 	 * 
 	 */
 	private static final long serialVersionUID = 1L;
-	Function<DDCharacter, Integer> save;
 	Function<AbilityScores.Scores, IntValue> access;
-	@NonFinal DDCharacter model;
 	
-	JTextField total;
-	JTextField ability;
-	NumberTextField temp;
-	JFormattedTextField baseSave;
-	JFormattedTextField magic;
-	JFormattedTextField misc;
-	private ObservableListener<IntValue> abilObserver;
+	IndirectObservableListener<DDCharacter> totalObserver;
+	IndirectObservableListener<DDCharacter> baseObserver;
+	ObservableListener<IntValue> abilObserver;
 	
 	public ResistanceLine(final String name, Function<DDCharacter, Integer> save, 
 			Function<AbilityScores.Scores, IntValue> func) {
-		this.save = save;
 		this.access = func;
 		
 		setMinimumSize(new Dimension(400, 25));
@@ -79,21 +72,21 @@ public class ResistanceLine extends JPanel {
 		gbc_label.gridy = 0;
 		add(label, gbc_label);
 		
-		total = new JTextField();
-		total.setToolTipText("Saving Throw");
-		total.setPreferredSize(new Dimension(30, 20));
-		total.setMinimumSize(new Dimension(30, 20));
-		total.setMaximumSize(new Dimension(30, 20));
-		total.setHorizontalAlignment(SwingConstants.CENTER);
-		total.setEditable(false);
-		total.setColumns(3);
-		total.setBorder(new LineBorder(Color.BLACK));
+		JTextField totalField = new JTextField();
+		totalField.setToolTipText("Saving Throw");
+		totalField.setPreferredSize(new Dimension(30, 20));
+		totalField.setMinimumSize(new Dimension(30, 20));
+		totalField.setMaximumSize(new Dimension(30, 20));
+		totalField.setHorizontalAlignment(SwingConstants.CENTER);
+		totalField.setEditable(false);
+		totalField.setColumns(3);
+		totalField.setBorder(new LineBorder(Color.BLACK));
 		GridBagConstraints gbc_total = new GridBagConstraints();
 		gbc_total.insets = new Insets(0, 0, 0, 5);
 		gbc_total.fill = GridBagConstraints.HORIZONTAL;
 		gbc_total.gridx = 1;
 		gbc_total.gridy = 0;
-		add(total, gbc_total);
+		add(totalField, gbc_total);
 		
 		JLabel label_1 = new JLabel("=");
 		GridBagConstraints gbc_label_1 = new GridBagConstraints();
@@ -103,21 +96,21 @@ public class ResistanceLine extends JPanel {
 		gbc_label_1.gridy = 0;
 		add(label_1, gbc_label_1);
 		
-		baseSave = new NumberTextField();
-		baseSave.setEditable(false);
-		baseSave.setToolTipText("Base Save");
-		baseSave.setPreferredSize(new Dimension(30, 20));
-		baseSave.setMinimumSize(new Dimension(30, 20));
-		baseSave.setMaximumSize(new Dimension(30, 20));
-		baseSave.setHorizontalAlignment(SwingConstants.CENTER);
-		baseSave.setColumns(3);
-		baseSave.setBorder(new LineBorder(Color.BLACK));
+		JFormattedTextField baseSaveField = new NumberTextField();
+		baseSaveField.setEditable(false);
+		baseSaveField.setToolTipText("Base Save");
+		baseSaveField.setPreferredSize(new Dimension(30, 20));
+		baseSaveField.setMinimumSize(new Dimension(30, 20));
+		baseSaveField.setMaximumSize(new Dimension(30, 20));
+		baseSaveField.setHorizontalAlignment(SwingConstants.CENTER);
+		baseSaveField.setColumns(3);
+		baseSaveField.setBorder(new LineBorder(Color.BLACK));
 		GridBagConstraints gbc_baseSave = new GridBagConstraints();
 		gbc_baseSave.insets = new Insets(0, 0, 0, 5);
 		gbc_baseSave.fill = GridBagConstraints.HORIZONTAL;
 		gbc_baseSave.gridx = 3;
 		gbc_baseSave.gridy = 0;
-		add(baseSave, gbc_baseSave);
+		add(baseSaveField, gbc_baseSave);
 		
 		JLabel label_2 = new JLabel("+");
 		GridBagConstraints gbc_label_2 = new GridBagConstraints();
@@ -127,21 +120,21 @@ public class ResistanceLine extends JPanel {
 		gbc_label_2.gridy = 0;
 		add(label_2, gbc_label_2);
 		
-		ability = new JTextField();
-		ability.setToolTipText("Ability Modifier");
-		ability.setPreferredSize(new Dimension(30, 20));
-		ability.setMinimumSize(new Dimension(30, 20));
-		ability.setMaximumSize(new Dimension(30, 20));
-		ability.setHorizontalAlignment(SwingConstants.CENTER);
-		ability.setEditable(false);
-		ability.setColumns(3);
-		ability.setBorder(new LineBorder(Color.BLACK));
+		JTextField abilityField = new JTextField();
+		abilityField.setToolTipText("Ability Modifier");
+		abilityField.setPreferredSize(new Dimension(30, 20));
+		abilityField.setMinimumSize(new Dimension(30, 20));
+		abilityField.setMaximumSize(new Dimension(30, 20));
+		abilityField.setHorizontalAlignment(SwingConstants.CENTER);
+		abilityField.setEditable(false);
+		abilityField.setColumns(3);
+		abilityField.setBorder(new LineBorder(Color.BLACK));
 		GridBagConstraints gbc_ability = new GridBagConstraints();
 		gbc_ability.insets = new Insets(0, 0, 0, 5);
 		gbc_ability.fill = GridBagConstraints.HORIZONTAL;
 		gbc_ability.gridx = 5;
 		gbc_ability.gridy = 0;
-		add(ability, gbc_ability);
+		add(abilityField, gbc_ability);
 		
 		JLabel label_3 = new JLabel("+");
 		GridBagConstraints gbc_label_3 = new GridBagConstraints();
@@ -151,20 +144,20 @@ public class ResistanceLine extends JPanel {
 		gbc_label_3.gridy = 0;
 		add(label_3, gbc_label_3);
 		
-		magic = new NumberTextField();
-		magic.setToolTipText("Magic Modifier");
-		magic.setPreferredSize(new Dimension(30, 20));
-		magic.setMinimumSize(new Dimension(30, 20));
-		magic.setMaximumSize(new Dimension(30, 20));
-		magic.setHorizontalAlignment(SwingConstants.CENTER);
-		magic.setColumns(3);
-		magic.setBorder(new LineBorder(Color.BLACK));
-		GridBagConstraints gbc_magic_1 = new GridBagConstraints();
-		gbc_magic_1.insets = new Insets(0, 0, 0, 5);
-		gbc_magic_1.fill = GridBagConstraints.HORIZONTAL;
-		gbc_magic_1.gridx = 7;
-		gbc_magic_1.gridy = 0;
-		add(magic, gbc_magic_1);
+		JFormattedTextField magicField = new NumberTextField();
+		magicField.setToolTipText("Magic Modifier");
+		magicField.setPreferredSize(new Dimension(30, 20));
+		magicField.setMinimumSize(new Dimension(30, 20));
+		magicField.setMaximumSize(new Dimension(30, 20));
+		magicField.setHorizontalAlignment(SwingConstants.CENTER);
+		magicField.setColumns(3);
+		magicField.setBorder(new LineBorder(Color.BLACK));
+		GridBagConstraints gbc_magic = new GridBagConstraints();
+		gbc_magic.insets = new Insets(0, 0, 0, 5);
+		gbc_magic.fill = GridBagConstraints.HORIZONTAL;
+		gbc_magic.gridx = 7;
+		gbc_magic.gridy = 0;
+		add(magicField, gbc_magic);
 		
 		JLabel label_4 = new JLabel("+");
 		GridBagConstraints gbc_label_4 = new GridBagConstraints();
@@ -174,20 +167,20 @@ public class ResistanceLine extends JPanel {
 		gbc_label_4.gridy = 0;
 		add(label_4, gbc_label_4);
 		
-		misc = new NumberTextField();
-		misc.setToolTipText("Miscellaneous Modifier");
-		misc.setPreferredSize(new Dimension(30, 20));
-		misc.setMinimumSize(new Dimension(30, 20));
-		misc.setMaximumSize(new Dimension(30, 20));
-		misc.setHorizontalAlignment(SwingConstants.CENTER);
-		misc.setColumns(3);
-		misc.setBorder(new LineBorder(Color.BLACK));
-		GridBagConstraints gbc_misc_1 = new GridBagConstraints();
-		gbc_misc_1.insets = new Insets(0, 0, 0, 5);
-		gbc_misc_1.fill = GridBagConstraints.HORIZONTAL;
-		gbc_misc_1.gridx = 9;
-		gbc_misc_1.gridy = 0;
-		add(misc, gbc_misc_1);
+		JFormattedTextField miscField = new NumberTextField();
+		miscField.setToolTipText("Miscellaneous Modifier");
+		miscField.setPreferredSize(new Dimension(30, 20));
+		miscField.setMinimumSize(new Dimension(30, 20));
+		miscField.setMaximumSize(new Dimension(30, 20));
+		miscField.setHorizontalAlignment(SwingConstants.CENTER);
+		miscField.setColumns(3);
+		miscField.setBorder(new LineBorder(Color.BLACK));
+		GridBagConstraints gbc_misc = new GridBagConstraints();
+		gbc_misc.insets = new Insets(0, 0, 0, 5);
+		gbc_misc.fill = GridBagConstraints.HORIZONTAL;
+		gbc_misc.gridx = 9;
+		gbc_misc.gridy = 0;
+		add(miscField, gbc_misc);
 		
 		JLabel label_5 = new JLabel("+");
 		GridBagConstraints gbc_label_5 = new GridBagConstraints();
@@ -212,40 +205,40 @@ public class ResistanceLine extends JPanel {
 		gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE};
 		panel.setLayout(gbl_panel);
 		
-		temp = new NumberTextField();
-		temp.setToolTipText("Temporary Modifier");
-		temp.setPreferredSize(new Dimension(30, 20));
-		temp.setMinimumSize(new Dimension(30, 20));
-		temp.setMaximumSize(new Dimension(30, 20));
-		temp.setHorizontalAlignment(SwingConstants.CENTER);
-		temp.setColumns(3);
-		temp.setBorder(new LineBorder(Color.BLACK));
+		NumberTextField tempField = new NumberTextField();
+		tempField.setToolTipText("Temporary Modifier");
+		tempField.setPreferredSize(new Dimension(30, 20));
+		tempField.setMinimumSize(new Dimension(30, 20));
+		tempField.setMaximumSize(new Dimension(30, 20));
+		tempField.setHorizontalAlignment(SwingConstants.CENTER);
+		tempField.setColumns(3);
+		tempField.setBorder(new LineBorder(Color.BLACK));
 		GridBagConstraints gbc_temp = new GridBagConstraints();
 		gbc_temp.insets = new Insets(3, 5, 0, 5);
 		gbc_temp.gridx = 0;
 		gbc_temp.gridy = 0;
-		panel.add(temp, gbc_temp);
+		panel.add(tempField, gbc_temp);
 		
-		abilObserver = new ObservableListener<>(ability,
+		totalObserver = new IndirectObservableListener<>(totalField,
+				(v) -> {
+					final int base = save.apply(v);
+					final int abil = AbilityScores.modifier(access.apply(v.getAbilities().getBase()).value());
+					final int magic = 0;
+					final int misc = 0;
+					final int temp = 0;
+					return StringHelper.toString(base + abil + magic + misc + temp);
+				});
+		baseObserver = new IndirectObservableListener<>(baseSaveField,
+				(v) -> StringHelper.toString(save.apply(v)));
+		abilObserver = new ObservableListener<>(abilityField,
 				new AbilModStringify());
 	}
 	
 	public void setModel(DDCharacter model) {
-		this.model = model;
-		abilObserver.setObserved(access.apply(model.getAbilities().getBase()));
-	}
-	
-	public void updateModel() {
-		final int save = this.save.apply(this.model);
-		final int abil = AbilityScores.modifier(this.access.apply(this.model.getAbilities().getBase()).value());
-		final int magic = 0;
-		final int misc = 0;
-		final int temp = 0;
-		this.total.setText(StringHelper.toString(save + abil + magic + misc + temp));
-		this.baseSave.setText(StringHelper.toString(save));
-		this.magic.setText(StringHelper.toString(magic));
-		this.misc.setText(StringHelper.toString(misc));
-		this.temp.setText(StringHelper.toString(temp, 0));
+		final IntValue abil = access.apply(model.getAbilities().getBase());
+		totalObserver.setObserved(model, abil);
+		baseObserver.setObserved(model, abil);
+		abilObserver.setObserved(abil);
 	}
 
 }

+ 0 - 6
src/org/leumasjaffe/charsheet/view/summary/ResistancePanel.java

@@ -59,10 +59,4 @@ public class ResistancePanel extends JPanel {
 		this.will.setModel(model);
 	}
 
-	public void updateModel() {
-		this.fortitude.updateModel();
-		this.reflex.updateModel();
-		this.will.updateModel();
-	}
-
 }