summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-27 13:45:38 +0200
committerPaul Buetow <paul@buetow.org>2026-03-27 13:45:38 +0200
commit38643ad8aca76dba2ac71987008d8c79370607cd (patch)
tree79bc974d69c606f56af7fb8106af757473ac7ac6
parent0bebec08cd89039c32bd9b9e73d80d573b6bf0b3 (diff)
Refresh and auto-start loaded startup simulations
-rw-r--r--src/main/java/simulator/VSSimulator.java10
-rw-r--r--src/main/java/simulator/VSSimulatorFrame.java36
-rw-r--r--src/test/java/simulator/VSSimulatorFrameStartupTest.java81
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);
+ }
+ }
+}