Canvas table: refresh fails in MRJ 4.x

(Apple bug # 3170840)

Problem:  Clicking the Refresh button often results in some components not appearing initially.  The component will appear typically after about 10 seconds (on a G4 400 with 192 MB RAM).

If you have any insights, workarounds or comments about this test page please contact Mickey Segal.  A listing of  many Java resources is at this link.

Source code:
import java.applet.*;
import java.awt.*;

public class CanvasTable extends Applet {

Button b;
Panel labelPanel;
int labels;

public void init() 
{
    b = new Button("Refresh");
    add(b);
    labels = 100;
    labelPanel = new Panel();
    labelPanel.setLayout(new GridLayout(labels/20, 20, 4, 4));
    add(labelPanel);
    addElements();
    validate();
}

final void addElements()
{
    LabelCanvas[] myLabel = new LabelCanvas[labels];
    for (int i=0; i<labels; i++)
    {
        myLabel[i] = new LabelCanvas(String.valueOf(i));
        myLabel[i].setBackground(Color.orange);
l        abelPanel.add(myLabel[i]);
    }
}

public boolean action(Event evt, Object obj)
{
    if (evt.target == b) 
    {
        labelPanel.removeAll();
        addElements();
        validate();
    }
    return super.action(evt, obj);
}
} // END OF Class CanvasTable



class LabelCanvas extends Canvas { 

int height;
int width;
Font f;
String label;
boolean needToResetWidth;

LabelCanvas(String label)
{
    this.label = label;
    f = new Font("Helvetica", Font.BOLD, 15);
    height = 30;
    needToResetWidth = true;
}

final void setWidth(Graphics g)
{
    FontMetrics fm = g.getFontMetrics();
    width = fm.stringWidth(label);
    needToResetWidth = false; 
}

public void addNotify()
{
    super.addNotify();
    repaint();
}

public final void paint(Graphics g)
{
    g.setFont(f);
    if (needToResetWidth) setWidth(g);
    g.drawString(label, 0, height - 5);


public final Dimension minimumSize()
{
    if (needToResetWidth)
    {
        Graphics g = getGraphics();
        setWidth(g);
        g.dispose();
    }
    return (new Dimension(width, height));
}

public final Dimension preferredSize()
{
    return(minimumSize());
}

public final void update(Graphics g)
{
    paint(g);
}
} // END OF Class LabelCanvas