Reputation: 884
I am doing a project for class and was cleaning up my indentation etc and have done something to my code. I cannot see the forest for the trees and could use some help. I am getting a cannot find symbol error when I compile. Here is the code.
public class TrafficLights extends JFrame implements ItemListener
{
private JRadioButton jrbRed;
private JRadioButton jrbYellow;
private JRadioButton jrbGreen;
private ButtonGroup btg = new ButtonGroup();
private TrafficLights.Light light = new TrafficLights.Light();
// ^ error 1 is here ^ error 2 is here
public static void main(String[] args)
{
TrafficLights frame = new TrafficLights();
frame.setDefaultCloseOperation(3);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public TrafficLights()
{
setTitle("Traffic Light Signal");
JPanel p1 = new JPanel();
p1.setLayout(new FlowLayout(1));
p1.add(this.light);
JPanel p2 = new JPanel();
p2.setLayout(new FlowLayout());
p2.add(this.jrbRed = new JRadioButton("Red"));
p2.add(this.jrbYellow = new JRadioButton("Yellow"));
p2.add(this.jrbGreen = new JRadioButton("Green"));
this.jrbRed.setMnemonic('R');
this.jrbYellow.setMnemonic('Y');
this.jrbGreen.setMnemonic('G');
this.btg.add(this.jrbRed);
this.btg.add(this.jrbYellow);
this.btg.add(this.jrbGreen);
setLayout(new BorderLayout());
add(p1, "Center");
add(p2, "South");
this.jrbRed.addItemListener(this);
this.jrbYellow.addItemListener(this);
this.jrbGreen.addItemListener(this);
this.jrbGreen.setSelected(true);
this.light.turnOnGreen();
}
public void itemStateChanged(ItemEvent e)
{
if (this.jrbRed.isSelected())
{
this.light.turnOnRed();
}
if (this.jrbYellow.isSelected())
{
this.light.turnOnYellow();
}
if (this.jrbGreen.isSelected())
{
this.light.turnOnGreen();
}
class Light extends JPanel
{
private boolean red;
private boolean yellow;
private boolean green;
public Light()
{ }
public void turnOnRed()
{
this.red = true;
this.yellow = false;
this.green = false;
repaint();
}
public void turnOnYellow()
{
this.red = false;
this.yellow = true;
this.green = false;
repaint();
}
public void turnOnGreen()
{
this.red = false;
this.yellow = false;
this.green = true;
repaint();
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
if (this.red)
{
g.setColor(Color.red);
g.fillOval(10, 10, 20, 20);
g.setColor(Color.black);
g.drawOval(10, 35, 20, 20);
g.drawOval(10, 60, 20, 20);
g.drawRect(5, 5, 30, 80);
}
else if (this.yellow)
{
g.setColor(Color.yellow);
g.fillOval(10, 35, 20, 20);
g.setColor(Color.black);
g.drawRect(5, 5, 30, 80);
g.drawOval(10, 10, 20, 20);
g.drawOval(10, 60, 20, 20);
}
else if (this.green)
{
g.setColor(Color.green);
g.fillOval(10, 60, 20, 20);
g.setColor(Color.black);
g.drawRect(5, 5, 30, 80);
g.drawOval(10, 10, 20, 20);
g.drawOval(10, 35, 20, 20);
}
else
{
g.setColor(Color.black);
g.drawRect(5, 5, 30, 80);
g.drawOval(10, 10, 20, 20);
g.drawOval(10, 35, 20, 20);
g.drawOval(10, 60, 20, 20);
}
}
public Dimension getPreferredSize()
{
return new Dimension(100, 100);
}
}
}
}
Upvotes: 0
Views: 690
Reputation: 1499800
This is the problem - I've indented the code to make it clearer...
public void itemStateChanged(ItemEvent e)
{
if (this.jrbRed.isSelected())
{
this.light.turnOnRed();
}
if (this.jrbYellow.isSelected())
{
this.light.turnOnYellow();
}
if (this.jrbGreen.isSelected())
{
this.light.turnOnGreen();
}
class Light extends JPanel
{
private boolean red;
private boolean yellow;
private boolean green;
...
You're currently declaring the Light
class within the itemStateChanged
method. I don't think you meant to do that.
Additionally, I would question whether you really need Light
to be an inner or nested class itself. I would suggest making it a top-level class - at least to start with. It'll be easier to navigate that way, apart from anything else.
I'd also strongly suggest trying to keep on top of your indentation at all times. If the rest of your code is already nicely indented, it's easier to see when something goes wrong. IDEs such as Eclipse are able to indent all your code for you at the touch of a button - I would advise you to use that feature heavily.
Upvotes: 2