Re: Graphics - how to show partial progress.
rossum wrote:
I am writing a graphics program that calculates individual colour
values for every point, hence it runs rather slowly as the
calculations for each point are somewhat complex. What I want to be
able to do is to show progress-so-far every so often, so the user gets
to see something, rather than a long wait with a blank screen. I know
I can do an updating % progress bar, but I would rather actually show
the progress on the screen so they can see a partial picture while the
next part is being calculated.
I am new to Java graphics, so I am probably missing some obvious
technique here; my google-fu has not found anything relevant to what I
want. In other languages I have used a technique with two Graphics
objects, updating one while displaying the other, but in this case I
cannot find a Component.setGraphics() method. Would it be possible to
do a similar thing with two separate JPanel objects?
The partial code below shows what I am trying, I need a "display and
continue calculating" function that I can call at intervals while
calculating points.
Does anyone have any suggestions?
Thanks in advance,
rossum
// --- Partial Code Starts ---
class GraphPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// Resize
Container parent = this.getParent();
this.setSize(parent.getWidth(), parent.getHeight());
// Draw points on screen
for (int x = 50; x < (250); ++x) {
for (int y = 60; y < (300); ++y) {
g.setColor(pickColour(x, y));
g.drawLine(x, y, x + 1, y + 1);
} // end for
if (x % 50 == 49) { showProgressSoFar(); }
} // end for
} // end paintComponent()
private Color pickColour(int x, int y) {
// Slow calculation of colour for point
switch ((x + y) % 3) {
case 0: return Color.CYAN;
case 1: return Color.GREEN;
case 2: return Color.MAGENTA;
default: return Color.BLACK;
} // end switch
} // end pickColor()
private void showProgressSoFar() {
// ###########################
// ### What do I put here? ###
// ###########################
} // end showProgressSoFar()
} // end class GraphPanel
// --- Partial Code Finishes ---
What are you using to store your pixel data in? If you use an integer
and store the data in nibbles you can update a BufferedImage with the
setRGB() method. It is very easy then to draw it partially completed.
--
Knute Johnson
email s/nospam/knute/