diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-27 13:45:38 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-27 13:45:38 +0200 |
| commit | 38643ad8aca76dba2ac71987008d8c79370607cd (patch) | |
| tree | 79bc974d69c606f56af7fb8106af757473ac7ac6 | |
| parent | 0bebec08cd89039c32bd9b9e73d80d573b6bf0b3 (diff) | |
Refresh and auto-start loaded startup simulations
| -rw-r--r-- | src/main/java/simulator/VSSimulator.java | 10 | ||||
| -rw-r--r-- | src/main/java/simulator/VSSimulatorFrame.java | 36 | ||||
| -rw-r--r-- | src/test/java/simulator/VSSimulatorFrameStartupTest.java | 81 |
3 files changed, 125 insertions, 2 deletions
diff --git a/src/main/java/simulator/VSSimulator.java b/src/main/java/simulator/VSSimulator.java index 2cf58c3..eac3dec 100644 --- a/src/main/java/simulator/VSSimulator.java +++ b/src/main/java/simulator/VSSimulator.java @@ -1553,5 +1553,15 @@ public class VSSimulator extends JPanel implements VSSerializable { updateTaskManagerTable(); updateProcessesComboBox(); processesComboBox.setSelectedIndex(processesComboBox.getItemCount()-1); + + revalidate(); + repaint(); + simulatorVisualization.revalidate(); + simulatorVisualization.repaint(); + + if (simulatorFrame != null) { + simulatorFrame.revalidate(); + simulatorFrame.repaint(); + } } } diff --git a/src/main/java/simulator/VSSimulatorFrame.java b/src/main/java/simulator/VSSimulatorFrame.java index 818bea9..3f14ca4 100644 --- a/src/main/java/simulator/VSSimulatorFrame.java +++ b/src/main/java/simulator/VSSimulatorFrame.java @@ -19,6 +19,7 @@ import javax.swing.JMenuItem; import javax.swing.JTabbedPane; import javax.swing.JToolBar; import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -601,13 +602,44 @@ public class VSSimulatorFrame extends VSFrame { VSSerialize serialize = new VSSerialize(); VSSimulator simulator = serialize.openSimulator(filename, this); - if (simulator != null) - startCurrentSimulator(); + if (simulator != null) { + refreshLoadedSimulator(simulator); + + final VSSimulator loadedSimulator = simulator; + if (SwingUtilities.isEventDispatchThread()) { + startCurrentSimulator(); + } else { + SwingUtilities.invokeLater(new Runnable() { + public void run() { + if (currentSimulator == loadedSimulator) + startCurrentSimulator(); + } + }); + } + } return simulator; } /** + * Refreshes the loaded simulator tab after deserialization. + * + * @param simulator the loaded simulator + */ + private void refreshLoadedSimulator(VSSimulator simulator) { + simulator.revalidate(); + simulator.repaint(); + + if (tabbedPane != null) { + tabbedPane.revalidate(); + tabbedPane.repaint(); + } + + revalidate(); + repaint(); + } + + /** * Pauses the current simulator */ public void pauseCurrentSimulator() { diff --git a/src/test/java/simulator/VSSimulatorFrameStartupTest.java b/src/test/java/simulator/VSSimulatorFrameStartupTest.java new file mode 100644 index 0000000..ecd64a3 --- /dev/null +++ b/src/test/java/simulator/VSSimulatorFrameStartupTest.java @@ -0,0 +1,81 @@ +package simulator; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.awt.GraphicsEnvironment; + +import javax.swing.SwingUtilities; + +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.Test; + +import prefs.VSDefaultPrefs; + +public class VSSimulatorFrameStartupTest { + private static final String RAFT_FILE = "saved-simulations/raft.dat"; + + private static final class TrackingSimulatorFrame extends VSSimulatorFrame { + private static final long serialVersionUID = 1L; + + volatile boolean revalidated; + volatile boolean repainted; + volatile int startCalls; + + TrackingSimulatorFrame() { + super(VSDefaultPrefs.init(), null); + setVisible(false); + } + + @Override + public void revalidate() { + super.revalidate(); + revalidated = true; + } + + @Override + public void repaint() { + super.repaint(); + repainted = true; + } + + @Override + public void startCurrentSimulator() { + ++startCalls; + super.startCurrentSimulator(); + } + + void resetTracking() { + revalidated = false; + repainted = false; + startCalls = 0; + } + } + + @Test + void openAndStartSimulatorRefreshesAndStartsLoadedSimulation() throws Exception { + Assumptions.assumeFalse(GraphicsEnvironment.isHeadless(), + "requires a display"); + + TrackingSimulatorFrame frame = new TrackingSimulatorFrame(); + try { + frame.resetTracking(); + + VSSimulator simulator = frame.openAndStartSimulator(RAFT_FILE); + assertNotNull(simulator); + + SwingUtilities.invokeAndWait(() -> { }); + + assertEquals(simulator, frame.getCurrentSimulator()); + assertTrue(frame.revalidated); + assertTrue(frame.repainted); + assertEquals(1, frame.startCalls); + assertFalse(simulator.getSimulatorCanvas().isPaused()); + assertTrue(simulator.getSimulatorCanvas().getNumProcesses() > 0); + } finally { + SwingUtilities.invokeAndWait(frame::dispose); + } + } +} |
