(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