Я пытаюсь создать симулятор, который будет печатать, какого цвета светится трафик c в данный момент в JTextField при нажатии кнопки «Пуск». Однако нажатие кнопки ничего не делает. У меня есть строки System.out, которые работают с одной и той же операцией, но текстовое поле не изменится. Я даже пытался вставить пользовательскую строку, просто чтобы посмотреть, изменится ли она при нажатии кнопки, но это не так, и я не совсем уверен, почему это происходит.
Это слушатель действия для кнопки
start.addActionListener((ActionEvent e) -> {
//String x = "hello";
//firstLight.setText(x);
TrafficLightSimulator tl =
new TrafficLightSimulator(TrafficLightColor.GREEN, "Thread 1");
TrafficLightSimulator t2 =
new TrafficLightSimulator(TrafficLightColor.RED, "Thread 2");
TrafficLightSimulator t3 =
new TrafficLightSimulator(TrafficLightColor.YELLOW, "Thread 3");
Thread thrd = new Thread(tl);
thrd.setName("Thread 1");
Thread thrd2 = new Thread(t2);
thrd.setName("Thread 2");
Thread thrd3 = new Thread(t3);
thrd.setName("Thread 3");
thrd.start();
thrd2.start();
thrd3.start();
firstLight.setText("hello");
for(int i=0; i < 9; i++) {
firstLight.setText("hello");
secondLight.setText(tl.getColor().toString());
System.out.println(tl.name + " is at " + tl.getColor());
System.out.println(t2.name + " is at " + t2.getColor());
System.out.println(t3.name + " is at " + t3.getColor());
tl.waitForChange();
t2.waitForChange();
t3.waitForChange();
}
tl.cancel();
t2.cancel();
t3.cancel();
});
И это весь код
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package intersectionsimulator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class IntersectionSimulator extends JFrame {
private JFrame frame;
private JPanel buttonPanel;
private JPanel outputPanel;
private JButton pause;
private JButton start;
private JButton stop;
private JLabel light1;
private JLabel light2;
private JLabel light3;
private JLabel car1;
private JLabel car2;
private JLabel car3;
private JTextField firstLight;
private JTextField secondLight;
private JTextField thirdLight;
private JTextField firstCar;
private JTextField secondCar;
private JTextField thirdCar;
IntersectionSimulator() {
frame = new JFrame("Intersection Simulator");
frame.setSize(750,500);
frame.setLayout(new GridLayout(1,2));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
buttonPanel = new JPanel();
outputPanel = new JPanel();
pause = new JButton("Pause");
start = new JButton("Start");
stop = new JButton("Stop");
light1 = new JLabel("First Traffic Light");
light2 = new JLabel("Second Traffic Light");
light3 = new JLabel("Third Traffic Light");
car1 = new JLabel("First Car");
car2 = new JLabel("Second Car");
car3 = new JLabel("Third Car");
firstLight = new JTextField(50);
secondLight = new JTextField(50);
thirdLight = new JTextField(50);
firstCar = new JTextField(50);
secondCar = new JTextField(50);
thirdCar = new JTextField(50);
buttonPanel.setLayout(new GridLayout(3,1));
buttonPanel.add(start);
buttonPanel.add(pause);
buttonPanel.add(stop);
frame.add(buttonPanel);
outputPanel.setLayout(new GridLayout(6,2));
outputPanel.add(light1);
outputPanel.add(firstLight);
outputPanel.add(light2);
outputPanel.add(secondLight);
outputPanel.add(light3);
outputPanel.add(thirdLight);
outputPanel.add(car1);
outputPanel.add(firstCar);
outputPanel.add(car2);
outputPanel.add(secondCar);
outputPanel.add(car3);
outputPanel.add(thirdCar);
frame.add(outputPanel);
frame.setVisible(true);
start.addActionListener((ActionEvent e) -> {
//String x = "hello";
//firstLight.setText(x);
TrafficLightSimulator tl =
new TrafficLightSimulator(TrafficLightColor.GREEN, "Thread 1");
TrafficLightSimulator t2 =
new TrafficLightSimulator(TrafficLightColor.RED, "Thread 2");
TrafficLightSimulator t3 =
new TrafficLightSimulator(TrafficLightColor.YELLOW, "Thread 3");
Thread thrd = new Thread(tl);
thrd.setName("Thread 1");
Thread thrd2 = new Thread(t2);
thrd.setName("Thread 2");
Thread thrd3 = new Thread(t3);
thrd.setName("Thread 3");
thrd.start();
thrd2.start();
thrd3.start();
firstLight.setText("hello");
for(int i=0; i < 9; i++) {
firstLight.setText("hello");
secondLight.setText(tl.getColor().toString());
System.out.println(tl.name + " is at " + tl.getColor());
System.out.println(t2.name + " is at " + t2.getColor());
System.out.println(t3.name + " is at " + t3.getColor());
tl.waitForChange();
t2.waitForChange();
t3.waitForChange();
}
tl.cancel();
t2.cancel();
t3.cancel();
});
}
enum TrafficLightColor {
RED, GREEN, YELLOW
}
class TrafficLightSimulator implements Runnable {
private TrafficLightColor tlc; // holds the current traffic light color
private boolean stop = false; // set to true to stop the simulation
private boolean changed = false; // true when the light has changed
String name;
TrafficLightSimulator(TrafficLightColor init, String n) {
tlc = init;
name = n;
}
TrafficLightSimulator() {
tlc = TrafficLightColor.RED;
}
// Start up the light.
@Override
public void run() {
while(!stop) {
try {
switch(tlc) {
case GREEN:
Thread.sleep(10000); // green for 10 seconds
break;
case YELLOW:
Thread.sleep(2000); // yellow for 2 seconds
break;
case RED:
Thread.sleep(12000); // red for 12 seconds
break;
}
} catch(InterruptedException exc) {
System.out.println(exc);
}
changeColor();
}
}
// Change color.
synchronized void changeColor() {
switch(tlc) {
case RED:
tlc = TrafficLightColor.GREEN;
break;
case YELLOW:
tlc = TrafficLightColor.RED;
break;
case GREEN:
tlc = TrafficLightColor.YELLOW;
}
changed = true;
notify(); // signal that the light has changed
}
// Wait until a light change occurs.
synchronized void waitForChange() {
try {
while(!changed)
wait(); // wait for light to change
changed = false;
} catch(InterruptedException exc) {
System.out.println(exc);
}
}
// Return current color.
synchronized TrafficLightColor getColor() {
return tlc;
}
// Stop the traffic light.
synchronized void cancel() {
stop = true;
}
}
public static void main(String[] args) {
IntersectionSimulator is = new IntersectionSimulator();
}
}