Browse Source

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 10 năm trước cách đây
mục cha
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();
-	}
-
 }