This is a traffic light application and I\'m trying to make my ChangeListener cl
ID: 3551189 • Letter: T
Question
This is a traffic light application and I'm trying to make my ChangeListener class work with my TrafficControlPanel2 class. I know it's easier to make ChangeListener an inner class, but my task is to make ChangeListener work as a separate class. Can someon help me please?
///////////////////////////////////////////////////////////////////////////
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TrafficControlPanel2 extends JPanel
{
private TrafficLightPanel2 TLP;
private JButton push;
ChangeListener Listener ;
public TrafficControlPanel2()
{
setLayout(new BorderLayout());
TLP = new TrafficLightPanel2();
push = new JButton("Change Light");
push.addActionListener(Listener);
setPreferredSize(new Dimension(150, 230));
add(TLP, BorderLayout.CENTER);
add(push, BorderLayout.SOUTH);
}
}
////////////////////////////////////////////////////////////////////////////////// ActionListener
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ChangeListener implements ActionListener
{
private TrafficLightPanel2 TLP;
private int click;
public ChangeListener(TrafficLightPanel2 panel)
{
TLP = panel;
click = 0;
}
public void actionPerformed (ActionEvent event)
{
click++;
TLP.change(click);
}
}
//////////////////////////////////////////////////// Draws traffic light
import javax.swing.*;
import java.awt.*;
public class TrafficLightPanel2 extends JPanel
{
private int currentState = 0;
private final int NUM_LIGHTS = 3; // the number of lights
private final int X = 50, Y = 10, WIDTH = 50, HEIGHT = 130; //box size
private final int DIAMETER = 30; //light diameter
private final int X_OFFSET = 10, Y_OFFSET = 10; // offsets to position the lights in the box
private final int PANEL_WIDTH = 150, PANEL_HEIGHT = 230; // the size of a traffic control panel
//Creates the traffic light panel
public void TrafficLightPanel()
{
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
}
public void paintComponent (Graphics page)
{
super.paintComponent(page);
int lightOn = currentState % NUM_LIGHTS;
setBackground(Color.white);
page.setColor(Color.lightGray);
page.fillRect(X, Y, WIDTH, HEIGHT);
//code to dtermine the light to turn on and turn on the light
if (lightOn == 0)
{
page.setColor(Color.red);
page.fillOval(50+X_OFFSET, 20, DIAMETER, DIAMETER);
page.setColor(Color.black);
page.fillOval(50+X_OFFSET, 50+Y_OFFSET, DIAMETER, DIAMETER);
page.fillOval(50+X_OFFSET, 90+Y_OFFSET, DIAMETER, DIAMETER);
}
else {
if (lightOn == 1)
{
page.setColor(Color.green);
page.fillOval(50+X_OFFSET, 90+Y_OFFSET, DIAMETER, DIAMETER);
page.setColor(Color.black);
page.fillOval(50+X_OFFSET, 20, DIAMETER, DIAMETER);
page.fillOval(50+X_OFFSET, 50+Y_OFFSET, DIAMETER, DIAMETER);
}
else {
page.setColor(Color.yellow);
page.fillOval(50+X_OFFSET, 50+Y_OFFSET, DIAMETER, DIAMETER);
page.setColor(Color.black);
page.fillOval(50+X_OFFSET, 20, DIAMETER, DIAMETER);
page.fillOval(50+X_OFFSET, 90+Y_OFFSET, DIAMETER, DIAMETER);
}
}
}
public void change(int clickcount)
{
currentState = clickcount;
repaint();
}
}
///////////////////////////////////////////////////////////////// Driver Class
import javax.swing.JFrame;
public class TrafficLight2
{
public static void main (String[] args)
{
JFrame frame = new JFrame("Traffic Control");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TrafficControlPanel2 panel = new TrafficControlPanel2();
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
}
Explanation / Answer
There was just one glitch in your program, and that was your ChangeListener class was never instantiated. In the ChangeListener constructor, you have an argument for TrafficLightPanel2 that will tell your listener which class to listen to. But that argument was never given to it. So your listener class was unaware of the speaker :p.
I did the modification and it seems to work now, let me know if you have any issues.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
////////////////////////////////////////////Changes are made only in this class
public class TrafficControlPanel2 extends JPanel
{
private TrafficLightPanel2 TLP;
private JButton push;
ChangeListener Listener ;
// things are adjusted here only
public TrafficControlPanel2(){
setLayout(new BorderLayout());
TLP = new TrafficLightPanel2();
push = new JButton("Change Light");
setPreferredSize(new Dimension(150, 230));
add(TLP, BorderLayout.CENTER);
add(push, BorderLayout.SOUTH);
// add all stuff to TLP and then add it to listener.
Listener = new ChangeListener(TLP);
// tell the listener to listen to events
push.addActionListener(Listener);
}
}
////////////////////////////////////////////////////////////////////////////////// ActionListener
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ChangeListener implements ActionListener
{
private TrafficLightPanel2 TLP;
private int click;
public ChangeListener(TrafficLightPanel2 panel)
{
TLP = panel;
click = 0;
}
public void actionPerformed (ActionEvent event)
{
click++;
TLP.change(click);
}
}
//////////////////////////////////////////////////// Draws traffic light
import javax.swing.*;
import java.awt.*;
public class TrafficLightPanel2 extends JPanel
{
private int currentState = 0;
private final int NUM_LIGHTS = 3; // the number of lights
private final int X = 50, Y = 10, WIDTH = 50, HEIGHT = 130; //box size
private final int DIAMETER = 30; //light diameter
private final int X_OFFSET = 10, Y_OFFSET = 10; // offsets to position the lights in the box
private final int PANEL_WIDTH = 150, PANEL_HEIGHT = 230; // the size of a traffic control panel
//Creates the traffic light panel
public void TrafficLightPanel()
{
setPreferredSize(new Dimension(PANEL_WIDTH, PANEL_HEIGHT));
}
public void paintComponent (Graphics page)
{
super.paintComponent(page);
int lightOn = currentState % NUM_LIGHTS;
setBackground(Color.white);
page.setColor(Color.lightGray);
page.fillRect(X, Y, WIDTH, HEIGHT);
//code to dtermine the light to turn on and turn on the light
if (lightOn == 0)
{
page.setColor(Color.red);
page.fillOval(50+X_OFFSET, 20, DIAMETER, DIAMETER);
page.setColor(Color.black);
page.fillOval(50+X_OFFSET, 50+Y_OFFSET, DIAMETER, DIAMETER);
page.fillOval(50+X_OFFSET, 90+Y_OFFSET, DIAMETER, DIAMETER);
}
else {
if (lightOn == 1)
{
page.setColor(Color.green);
page.fillOval(50+X_OFFSET, 90+Y_OFFSET, DIAMETER, DIAMETER);
page.setColor(Color.black);
page.fillOval(50+X_OFFSET, 20, DIAMETER, DIAMETER);
page.fillOval(50+X_OFFSET, 50+Y_OFFSET, DIAMETER, DIAMETER);
}
else {
page.setColor(Color.yellow);
page.fillOval(50+X_OFFSET, 50+Y_OFFSET, DIAMETER, DIAMETER);
page.setColor(Color.black);
page.fillOval(50+X_OFFSET, 20, DIAMETER, DIAMETER);
page.fillOval(50+X_OFFSET, 90+Y_OFFSET, DIAMETER, DIAMETER);
}
}
}
public void change(int clickcount)
{
this.currentState = clickcount;
repaint();
}
}
///////////////////////////////////////////////////////////////// Driver Class
import javax.swing.JFrame;
public class TrafficLight2
{
public static void main (String[] args)
{
JFrame frame = new JFrame("Traffic Control");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TrafficControlPanel2 panel = new TrafficControlPanel2();
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.