浏览代码

Fix up a bunch of objects to properly use removeNotify().

Sam Jaffe 5 年之前
父节点
当前提交
34384116e5

+ 5 - 3
src/main/lombok/org/leumasjaffe/recipe/view/ElementPanel.java

@@ -32,7 +32,7 @@ import javax.swing.Box;
 @FieldDefaults(level=AccessLevel.PRIVATE)
 public class ElementPanel extends JScrollPane {
 	ForwardingObservableListener<Element> listener = new ForwardingObservableListener<>();
-	ObservableListener<JTextField, Element> nameListener;
+	ObservableListener<JTextField, Element> nameController;
 	ObservableListener<CollatedDurationPanel, Element> durationListener;
 
 	@Getter(AccessLevel.PACKAGE) JTextField txtName;
@@ -77,7 +77,7 @@ public class ElementPanel extends JScrollPane {
 		setViewportView(panelViewPort);
 		panelViewPort.setLayout(new VerticalLayout(5));
 		
-		nameListener = ObservableController.from(txtName,
+		nameController = ObservableController.from(txtName,
 				Element::getName, Element::setName);
 		durationListener = new ObservableListener<>(panelDuration,
 				(c, v) -> c.setModel(v.getCollatedDuration()));
@@ -96,7 +96,7 @@ public class ElementPanel extends JScrollPane {
 		}
 		
 		listener.setObserved(element, element.getPhases());
-		nameListener.setObserved(element);
+		nameController.setObserved(element);
 		durationListener.setObserved(element);
 	}
 	
@@ -104,5 +104,7 @@ public class ElementPanel extends JScrollPane {
 	public void removeNotify() {
 		super.removeNotify();
 		ObserverDispatch.unsubscribeAll(listener);
+		ObserverDispatch.unsubscribeAll(nameController);
+		ObserverDispatch.unsubscribeAll(durationListener);
 	}
 }

+ 2 - 0
src/main/lombok/org/leumasjaffe/recipe/view/IngredientPanel.java

@@ -99,6 +99,8 @@ public class IngredientPanel extends JPanel implements AutoGrowPanel.ChildCompon
 	public void removeNotify() {
 		super.removeNotify();
 		ObserverDispatch.unsubscribeAll(nameController);
+		ObserverDispatch.unsubscribeAll(amountController);
+		ObserverDispatch.unsubscribeAll(preparationController);
 	}
 
 	@Override

+ 11 - 3
src/main/lombok/org/leumasjaffe/recipe/view/PreparationPanel.java

@@ -6,6 +6,7 @@ import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.observer.IndirectObservableListener;
 import org.leumasjaffe.observer.ObservableController;
 import org.leumasjaffe.observer.ObservableListener;
+import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.controller.ReplaceChildrenController;
 import org.leumasjaffe.recipe.model.Duration;
 import org.leumasjaffe.recipe.model.Ingredient;
@@ -30,7 +31,7 @@ import javax.swing.JFormattedTextField;
 public class PreparationPanel extends JPanel {
 	ReplaceChildrenController<Preparation, Ingredient> controller;
 	IndirectObservableListener<JPanel, Preparation> childListener;
-	ObservableListener<JFormattedTextField, Preparation> durationListener;
+	ObservableListener<JFormattedTextField, Preparation> durationController;
 	
 	public PreparationPanel() {
 		controller = new ReplaceChildrenController<>(Preparation::getIngredients,
@@ -91,7 +92,7 @@ public class PreparationPanel extends JPanel {
 		// This indirection allows for testing of controller
 		childListener = new IndirectObservableListener<>(panelIngredients,
 				(c, v) -> controller.accept(c, v));
-		durationListener = ObservableController.from(panelDuration.txtTime,
+		durationController = ObservableController.from(panelDuration.txtTime,
 				Preparation::getDuration, Preparation::setDuration);
 	}
 	
@@ -101,8 +102,15 @@ public class PreparationPanel extends JPanel {
 	}
 	
 	public void setModel(final Phase phase) {
-		durationListener.setObserved(phase.getPreparation().get());
 		childListener.setObserved(phase.getPreparation().get(), phase);
+		durationController.setObserved(phase.getPreparation().get());
+	}
+	
+	@Override
+	public void removeNotify() {
+		super.removeNotify();
+		ObserverDispatch.unsubscribeAll(childListener);
+		ObserverDispatch.unsubscribeAll(durationController);
 	}
 
 }

+ 8 - 0
src/main/lombok/org/leumasjaffe/recipe/view/RecipeCardPanel.java

@@ -5,6 +5,7 @@ import javax.swing.JSplitPane;
 import org.jdesktop.swingx.VerticalLayout;
 import org.leumasjaffe.observer.ForwardingObservableListener;
 import org.leumasjaffe.observer.ObservableListener;
+import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.RecipeCard;
 import org.leumasjaffe.recipe.view.summary.SummaryPanel;
 
@@ -55,5 +56,12 @@ public class RecipeCardPanel extends JSplitPane {
 		listener.setObserved(card, card.getElements());
 		updateUI.setObserved(card);		
 	}
+	
+	@Override
+	public void removeNotify() {
+		super.removeNotify();
+		ObserverDispatch.unsubscribeAll(listener);
+		ObserverDispatch.unsubscribeAll(updateUI);
+	}
 
 }

+ 10 - 3
src/main/lombok/org/leumasjaffe/recipe/view/RestPanel.java

@@ -4,6 +4,7 @@ import javax.swing.JPanel;
 
 import org.leumasjaffe.observer.ObservableController;
 import org.leumasjaffe.observer.ObservableListener;
+import org.leumasjaffe.observer.ObserverDispatch;
 import org.leumasjaffe.recipe.model.Rest;
 
 import lombok.AccessLevel;
@@ -19,7 +20,7 @@ import java.awt.Insets;
 @SuppressWarnings("serial")
 @FieldDefaults(level=AccessLevel.PRIVATE)
 public class RestPanel extends JPanel {
-	ObservableListener<JFormattedTextField, Rest> durationListener;
+	ObservableListener<JFormattedTextField, Rest> durationController;
 
 	JLabel lblLocation;
 
@@ -51,7 +52,7 @@ public class RestPanel extends JPanel {
 		gbc_panelDuration.gridy = 0;
 		add(panelDuration, gbc_panelDuration);
 		
-		durationListener = ObservableController.from(panelDuration.txtTime,
+		durationController = ObservableController.from(panelDuration.txtTime,
 				Rest::getDuration, Rest::setDuration);
 	}
 
@@ -62,7 +63,13 @@ public class RestPanel extends JPanel {
 	
 	public void setModel(final Rest rest) {
 		lblLocation.setText(rest.getWhere().getHumanReadable());
-		durationListener.setObserved(rest);
+		durationController.setObserved(rest);
+	}
+	
+	@Override
+	public void removeNotify() {
+		super.removeNotify();
+		ObserverDispatch.unsubscribeAll(durationController);
 	}
 
 }

+ 8 - 6
src/main/lombok/org/leumasjaffe/recipe/view/StepPanel.java

@@ -31,8 +31,8 @@ import java.awt.Dimension;
 @FieldDefaults(level=AccessLevel.PRIVATE)
 public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 	ForwardingObservableListener<Step> listener = new ForwardingObservableListener<>();
-	ObservableListener<JTextPane, Step> intructionListener;
-	ObservableListener<JFormattedTextField, Step> durationListener;
+	ObservableListener<JTextPane, Step> instructionListener;
+	ObservableListener<JFormattedTextField, Step> durationController;
 
 	JLabel lblIndex;
 	@Getter(AccessLevel.PACKAGE) JTextPane txtpnInstructions;
@@ -98,9 +98,9 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 		gbc_txtpnInstructions.gridy = 0;
 		add(txtpnInstructions, gbc_txtpnInstructions);
 		
-		intructionListener = ObservableController.from(txtpnInstructions,
+		instructionListener = ObservableController.from(txtpnInstructions,
 				Step::getInstruction, Step::setInstruction);
-		durationListener = ObservableController.from(panelDuration.txtTime,
+		durationController = ObservableController.from(panelDuration.txtTime,
 				Step::getDuration, Step::setDuration);
 		
 		setListPosition(0);
@@ -119,14 +119,16 @@ public class StepPanel extends JPanel implements AutoGrowPanel.ChildComponent {
 			}
 		});
 		listener.setObserved(step, step.getIngredients());
-		intructionListener.setObserved(step);
-		durationListener.setObserved(step);
+		instructionListener.setObserved(step);
+		durationController.setObserved(step);
 	}
 	
 	@Override
 	public void removeNotify() {
 		super.removeNotify();
 		ObserverDispatch.unsubscribeAll(listener);
+		ObserverDispatch.unsubscribeAll(instructionListener);
+		ObserverDispatch.unsubscribeAll(durationController);
 	}
 
 	@Override

+ 2 - 2
src/test/java/org/leumasjaffe/recipe/view/PreparationPanelTest.java

@@ -22,7 +22,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 @ExtendWith(MockitoExtension.class)
 class PreparationPanelTest extends SwingTestCase {
 	
-	@Mock ObservableListener<JFormattedTextField, Preparation> durationListener;
+	@Mock ObservableListener<JFormattedTextField, Preparation> durationController;
 	@Mock ReplaceChildrenController<Preparation, Ingredient> controller;
 	Preparation stuff = new Preparation();
 	@Mock Phase parent;
@@ -36,7 +36,7 @@ class PreparationPanelTest extends SwingTestCase {
 
 	@Test
 	void testHasContent() {
-		verify(durationListener, times(1)).setObserved(same(stuff));
+		verify(durationController, times(1)).setObserved(same(stuff));
 		verify(controller, times(1)).accept(any(), same(stuff));
 	}
 

+ 2 - 2
src/test/java/org/leumasjaffe/recipe/view/RestPanelTest.java

@@ -25,7 +25,7 @@ class RestPanelTest extends SwingTestCase {
 	Rest stuff;
 	
 	@Spy JLabel lblLocation;
-	@Mock ObservableListener<JFormattedTextField, Rest> durationListener;
+	@Mock ObservableListener<JFormattedTextField, Rest> durationController;
 	@InjectMocks RestPanel panel = new RestPanel();
 	
 	@BeforeEach
@@ -44,6 +44,6 @@ class RestPanelTest extends SwingTestCase {
 
 	@Test
 	void testDurationIsListeningToModel() {
-		verify(durationListener).setObserved(same(stuff));
+		verify(durationController).setObserved(same(stuff));
 	}
 }