1 Attachment(s)
[RESOLVED] Can't decipher errors
I'm trying to create an LED stopwatch GUI but am completely stumped. I have the skeleton code but haven't really been able to do anything with it, and ran into some errors while compiliing:
Code:
assig5.java:75: reference to Timer is ambiguous, both class javax.swing.Timer in
javax.swing and class java.util.Timer in java.util match
private Timer T;
^
assig5.java:19: non-static variable this cannot be referenced from a static cont
ext
new A5Help(sz, rate);
^
assig5.java:102: reference to Timer is ambiguous, both class javax.swing.Timer i
n javax.swing and class java.util.Timer in java.util match
T = new Timer(rate, this);
^
3 errors
I'm new to java, but i took visual basic for 3 years in high school so i understand it conceptually. I just can't physically program too well yet.
Re: Can't decipher errors
There is a Timer class in both the javax.swing package and the java.util package. If you import both, then the compiler doesn't know which one to use.
You can distinguish between the two by using their qualified names, ex:
Code:
private javax.swing.Timer T;
- petter
Re: Can't decipher errors
Most people post their code and forget to post the errors, you've done the opposite.
Having said that:
The first and third errors are the same error. It is because there are two Timer classes in the jdk and presumably you've included import statements for both of them (or you've included both of the packages they are in) and so the compiler doesn't know which one you want to use.
The solution is to explicitly import each class you want to use rather than importing the whole package. Alternatively you can specify the package name when declaring the variable ie:
Code:
private java.util.Timer T;
The second error is because you can not access instance variables from static methods. Without seeing the code it's hard to suggest a solution.
------------------------------------------
EDIT: Sorry WildFrog hadn't spotted you'd already answered this
1 Attachment(s)
Re: Can't decipher errors
Sorry bout that. I wasn't sure how i should post the code whether just copy the text or attach the file. It's rather long but i'll link it below and in the main post. Thank you for the input i'll start there.
Re: Can't decipher errors
Quote:
Originally Posted by
jenseits
Sorry bout that. I wasn't sure how i should post the code whether just copy the text or attach the file.
Perhaps if you read the 'Before You Post' guide at the top of the forum you'd know...
It's odd that people asking for help seem unable to make that tiny effort to improve their chances of a good response...
If I had eight hours to chop down a tree, I would spend 6 hours sharpening an axe...
Anonymous
Re: Can't decipher errors
Quote:
Originally Posted by
dlorde
Perhaps if you read the '
Before You Post' guide at the top of the forum you'd know...
It's odd that people asking for help seem unable to make that tiny effort to improve their chances of a good response...
If I had eight hours to chop down a tree, I would spend 6 hours sharpening an axe...
Anonymous
I didn't want to just throw a wall of code on here and wait for an answer, now that i know i can make it easier
Re: Can't decipher errors
Quote:
Originally Posted by
keang
The second error is because you can not access instance variables from static methods. Without seeing the code it's hard to suggest a solution.
------------------------------------------
EDIT: Sorry WildFrog hadn't spotted you'd already answered this
I managed to resolve the 1st problem, the only error i'm getting is that one, I tried experimenting but i can't figure out how to gain that access. Would a mutator help? I had just thought of that.
Re: Can't decipher errors
As I said before we need to see your code and most of us won't click on links so it needs to be posted inline (remembering to use code tags). If it is several hundered lines then just post the relevant snippets of code and an explanation of what you are trying to achieve.
Re: Can't decipher errors
Code:
public static void main(String [] args)
{
new assig5();
int sz = Integer.parseInt(args[0]);
int rate = Integer.parseInt(args[1]);
//new A5Help(sz, rate);
}
public class A5Help
{
private MyPanel thePanel;
private JFrame theWindow;
public A5Help(int sz, int rate)
{
theWindow = new JFrame("Stopwatch");
thePanel = new MyPanel(sz, rate);
Container c = theWindow.getContentPane();
c.add(thePanel, BorderLayout.CENTER);
theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theWindow.pack();
theWindow.setVisible(true);
}
}
This is where the error is occuring
Re: Can't decipher errors
Quote:
Originally Posted by
jenseits
This is where the error is occuring
Where? There's only one static method, and it doesn't reference any instance variables.
What is the error? Post up the full text of the error message and stack trace, and post the code containing the line that the error specifies.
The biggest difference between time and space is that you can't reuse time...
M. Furst
Re: Can't decipher errors
Quote:
Originally Posted by dlorde
Where? There's only one static method, and it doesn't reference any instance variables.
I think he/she is referring to the commented out line "new A5Help(sz, rate);" in the main method. My guess is the main method is in the class assig5 and A5Help is an inner class of assig5.
Re: Can't decipher errors
Code:
assig5.java:19: non-static variable this cannot be referenced from a static context
new A5Help(sz, rate);
^
1 error
This is the error i get when i try to compile it, which is in reference to the public static void main section of my code:
Code:
public static void main(String [] args)
{
new assig5();
int sz = Integer.parseInt(args[0]);
int rate = Integer.parseInt(args[1]);
new A5Help(sz, rate); <--------- (was commented out earlier to see what happened
}
public class A5Help
{
private MyPanel thePanel;
private JFrame theWindow;
public A5Help(int sz, int rate)
{
theWindow = new JFrame("Stopwatch");
thePanel = new MyPanel(sz, rate);
Container c = theWindow.getContentPane();
c.add(thePanel, BorderLayout.CENTER);
theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theWindow.pack();
theWindow.setVisible(true);
}
}
I tried to compliment it out so i could run the program and see if it'd compile, which it did. I guess i'm trying to find a way to reference this in the "main" code.
Re: Can't decipher errors
So is A5Help an inner class and if so why?
Looking at the size of the attached file your code can't be that many lines, so why not just post the whole lot inline so we can see what's going on. And remember to explain what it's supposed to do.
Re: Can't decipher errors
Quote:
Originally Posted by
keang
So is A5Help an inner class and if so why?
Looking at the size of the attached file your code can't be that many lines, so why not just post the whole lot inline so we can see what's going on. And remember to explain what it's supposed to do.
Looking at it now you're right, i don't need both to be declared as an inner class, i'll change it. I'll post the rest of it.
Code:
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.awt.geom.*;
import java.util.Random;
import javax.swing.*;
import java.awt.event.*;
public class assig5
{
public static void main(String [] args)
{
new assig5();
int sz = Integer.parseInt(args[0]);
int rate = Integer.parseInt(args[1]);
//new A5Help(sz, rate);
}
public class A5Help
{
private MyPanel thePanel;
private JFrame theWindow;
public A5Help(int sz, int rate)
{
theWindow = new JFrame("CS 401 A5 Help Program");
thePanel = new MyPanel(sz, rate);
Container c = theWindow.getContentPane();
c.add(thePanel, BorderLayout.CENTER);
theWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
theWindow.pack();
theWindow.setVisible(true);
}
}
class CrazyLED extends LED
{
private int active;
public CrazyLED(int X, int Y, int sz)
{
super(X, Y, sz);
active = 0;
}
public void draw(Graphics2D g2)
{
// I am increasing the stroke width so the LED looks better
g2.setStroke(new BasicStroke(8));
g2.setColor(Color.blue);
g2.draw(segments[active]);
// Setting the stroke back to the default here -- see what happens
// if you don't do this.
g2.setStroke(new BasicStroke());
}
public void mutate()
{
active = (active + 1) % segments.length;
}
}
public class MyPanel extends JPanel implements ActionListener
{
private CrazyLED theLED;
private JButton start, stop, move;
private JPanel buttonPanel;
private ButtonListener bListener;
private javax.swing.Timer T;
private int size;
private int prefWid, prefHt;
public MyPanel(int sz, int rate)
{
size = sz;
prefWid = 5 * size;
prefHt = 4 * size;
Random R = new Random();
int x = R.nextInt(prefWid - size);
int y = R.nextInt(prefHt - 2*size);
theLED = new CrazyLED(x, y, size);
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1, 2));
bListener = new ButtonListener();
start = new JButton("Go");
start.addActionListener(bListener);
buttonPanel.add(start);
stop = new JButton("Stop");
stop.addActionListener(bListener);
stop.setEnabled(false);
buttonPanel.add(stop);
this.add(buttonPanel, BorderLayout.NORTH);
T = new Timer(rate, this);
}
public Dimension getPreferredSize()
{
return new Dimension(prefWid, prefHt);
}
private class ButtonListener implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == start)
{
T.start();
start.setEnabled(false);
stop.setEnabled(true);
}
else if (e.getSource() == stop)
{
T.stop();
stop.setEnabled(false);
start.setEnabled(true);
}
}
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if (theLED != null)
theLED.draw(g2);
}
// The ActionListener that is fired by the Timer
public void actionPerformed(ActionEvent e)
{
theLED.mutate();
repaint();
}
}
public abstract class LED implements Drawable
{
protected Line2D [] segments;
protected int size;
public LED(int X, int Y, int sz)
{
size = sz;
segments = new Line2D[7];
int startX = X, startY = Y;
int endX = startX + size, endY = startY;
segments[0] = new Line2D.Double(startX, startY, endX, endY);
startX = endX; startY = endY; endY = endY + size;
segments[1] = new Line2D.Double(startX, startY, endX, endY);
startX = endX; startY = endY; endY = endY + size;
segments[2] = new Line2D.Double(startX, startY, endX, endY);
startX = endX; startY = endY; endX = endX - size;
segments[3] = new Line2D.Double(startX, startY, endX, endY);
startX = endX; startY = endY; endY = endY - size;
segments[4] = new Line2D.Double(startX, startY, endX, endY);
startX = endX; startY = endY; endY = endY - size;
segments[5] = new Line2D.Double(startX, startY, endX, endY);
startX = X; startY = Y + size; endX = X + size; endY = startY;
segments[6] = new Line2D.Double(startX, startY, endX, endY);
}
public abstract void draw(Graphics2D g);
}
}
The program is supposed to act like an LED stopwatch. You click on a start button and it starts counting. Every "tick" the display changes to show the lines of the digit from 0-9, and reseting at one cycle. Now for the 10 second and minute mark it will only go to 5 then reset. After a full cycle the next digit tallies. I have the skeleton coding here, but i haven't really started doing anything with the buttons. I'm just trying to get it to compile so a panel comes up, but doesn't do anything.
Re: Can't decipher errors
It would have helped if the OP posted the code that caused the error, rather than code where the problem line is commented out without explanation...
In terms of scope, an inner class is much like a class field - you can't access an instance field or class from a static scope. If you want to access class A5Help from a static method, you'll have to declare the class itself static.
Using inner classes for an exercise of this kind is not recommended. Inner classes have their uses, but there is quite a range of options for them which can make them appear complicated and obscure to a novice coder. They are really best left until there is a clear requirement for them, then treated individually, according to the circumstances.
If you really must put all your exercise classes into the same file (which, btw, is very bad practice), at least put them outside the main class scope. You won't be able to declare them public, but you'll avoid some of the confusion that inner classes can cause. Best of all, follow Best Practice and put them in their own files until you are clear about why you'd want to do it differently.
Good judgment comes from experience; experience comes from bad judgment...
F. Brook