Hello,
I want to build my application from three main classes.
1. A frame class to handle file operations.
2. A Drawing panel to render images to.
3. An engine to perform the actual rendering.
All the examples I have read so far for Image stuff in Java have
everything stuffed into one monolithic class, and the crux of the
rendering seems to be done in paint(Graphics g) or
paintComponent(Graphics g) using a g2d object cast againg the parameter g.
If I wanted to do calculations for rotations translations etc I can do
this with the AffineTransform class setX methods, but the drawImage
method of g2d seems to be handled in the paint/paintComponent methods.
This is fine until I want to specify x, y arguments in the drawImage
Method as neither Paint or PaintComponent take these parameters in their
method signature how can I do this, is there another way to draw apart
from the paint/paint component methods?
Any help appreciated.
Knute Johnson - 13 Mar 2008 21:23 GMT
> Hello,
>
[quoted text clipped - 18 lines]
>
> Any help appreciated.
Just make the parameters class variables and they will be visible to
both your calculation method and your rendering method.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class test7 extends JPanel implements Runnable {
static final Color[] COLORS =
{Color.RED, Color.BLUE, Color.GREEN, Color.WHITE};
volatile int colorIndex;
public test7() {
setPreferredSize(new Dimension(400,300));
}
public void paintComponent(Graphics g) {
g.setColor(COLORS[colorIndex]);
g.fillRect(0,0,getWidth(),getHeight());
}
public void run() {
while (true) {
++colorIndex;
colorIndex %= 4;
repaint();
try {
Thread.sleep(1000);
} catch (InterruptedException ie) { }
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test7 t7 = new test7();
f.add(t7);
f.pack();
f.setVisible(true);
new Thread(t7).start();
}
});
}
}
The frame to hold your display component need be no more complicated
than the one I show here. If you need menus, add those to the frame but
have the display component implement ActionListener. You could
separate the rendering method from the display class but there is
probably no real need. If you want one display class and multiple
calculating methods, just override that method.
The volatile modifier is needed on the colorIndex variable because it
will be read in more than one thread. If you are going to do more
sophisticated animation, consider using a javax.swing.Timer so that the
calculations can be done on the EDT (unless they take a long time).
Take a look at the Asteroids game I wrote that has many of these
concepts in action.
http://rabbitbrush.frazmtn.com/
The source code is there on the applet page.

Signature
Knute Johnson
email s/nospam/linux/
RichT - 13 Mar 2008 21:56 GMT
> Just make the parameters class variables and they will be visible to
> both your calculation method and your rendering method.
[quoted text clipped - 62 lines]
>
> The source code is there on the applet page.
Hi, thanks for your help :)
Knute Johnson - 13 Mar 2008 21:25 GMT
> Hello,
>
[quoted text clipped - 18 lines]
>
> Any help appreciated.
Look at the AnalogClock code too.

Signature
Knute Johnson
email s/nospam/linux/
Roedy Green - 19 Mar 2008 12:21 GMT
>All the examples I have read so far for Image stuff in Java have
>everything stuffed into one monolithic class, and the crux of the
>rendering seems to be done in paint(Graphics g) or
>paintComponent(Graphics g) using a g2d object cast againg the parameter g.
have a look at http://mindprod.com/products.html#SCREWS
too see some sample code.

Signature
Roedy Green Canadian Mind Products
The Java Glossary
http://mindprod.com