-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCarWorld.java
More file actions
executable file
·73 lines (61 loc) · 2.26 KB
/
CarWorld.java
File metadata and controls
executable file
·73 lines (61 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.awt.*;
import java.util.*;
import javax.swing.*;
/**
* CarWorld.java — Swing panel that spawns/coordinated car threads.
*
* THREAD-SAFETY SUMMARY:
* - A SINGLE TrafficController INSTANCE IS SHARED BY EVERY CAR TO SERIALIZE BRIDGE ACCESS.
* - SwingUtilities.invokeLater ENSURES ADDING CARS/TOUCHING SWING STATE HAPPENS ON THE EDT.
* - EACH CAR GETS ITS OWN THREAD SO MOVEMENT HAPPENS CONCURRENTLY, BUT CONTROLLER CALLS KEEP
* THE BRIDGE SAFE.
*/
class CarWorld extends JPanel {
Image bridge;
Image redCar;
Image blueCar;
TrafficController controller;
ArrayList<Car> blueCars = new ArrayList<Car>();
ArrayList<Car> redCars = new ArrayList<Car>();
public CarWorld() {
controller = new TrafficController(); // SINGLE MONITOR SHARED BY EVERY CAR THREAD
MediaTracker mt = new MediaTracker(this);
Toolkit toolkit = Toolkit.getDefaultToolkit();
redCar = toolkit.getImage("image/redcar.gif");
mt.addImage(redCar, 0);
blueCar = toolkit.getImage("image/bluecar.gif");
mt.addImage(blueCar, 1);
bridge = toolkit.getImage("image/bridge1.gif");
mt.addImage(bridge, 2);
try {
mt.waitForID(0);
mt.waitForID(1);
mt.waitForID(2);
} catch (java.lang.InterruptedException e) {
System.out.println("Couldn't load one of the images");
}
redCars.add(new Car(Car.REDCAR,null,redCar,null));
blueCars.add(new Car(Car.BLUECAR,null,blueCar,null));
setPreferredSize(new Dimension(bridge.getWidth(null),bridge.getHeight(null)));
}
public void paintComponent(Graphics g) {
g.drawImage(bridge,0,0,this);
for (Car c : redCars) c.draw(g);
for (Car c : blueCars) c.draw(g);
}
public void addCar(final int cartype) {
SwingUtilities.invokeLater(new Runnable () { // ENSURE UI MUTATIONS HAPPEN ON EDT FOR THREAD SAFETY
public void run() {
Car c;
if (cartype==Car.REDCAR) {
c = new Car(cartype,redCars.get(redCars.size()-1),redCar,controller);
redCars.add(c);
} else {
c = new Car(cartype,blueCars.get(blueCars.size()-1),blueCar,controller);
blueCars.add(c);
}
new Thread(c).start(); // START A NEW CAR THREAD SO MOVEMENT HAPPENS CONCURRENTLY
}
});
}
}