Instances of java.awt.Dialog are often used to display error messages in an application. As a result, you may find yourself writing a component that displays a message in a Dialog when a user performs some action. However, implementing this behavior is complicated by the fact that the Dialog constructors require a reference to a java.awt.Frame instance. It's not usually desirable to have your components "know about" or rely upon a reference to the Frame that contains them. That approach is known as tight coupling, and makes code difficult to reuse.
To obtain a reference to the Frame without tight coupling, you can traverse the component tree until you find an instance of the Frame class. Then you can create a Dialog instance to display messages. When the InfoPanel class needs access to a Dialog instance, it can call the getErrorDialog() method, which in turn calls createDialog(). The createDialog() method is called recursively until passed a reference to a Frame, which it uses to construct an instance of Dialog.
import java.awt.*;
public class InfoPanel extends Panel {
Dialog errorDialog;
public Dialog getErrorDialog() {
if (errorDialog == null) {
errorDialog = createDialog(this);
} // if (errorDialog == null)
return errorDialog;
} // public Dialog getErrorDialog()
private static Dialog createDialog(Component comp) {
if (comp instanceof Frame) {
return new Dialog((Frame)comp);
} // if (comp instanceof Frame)
else return createDialog(comp.getParent());
} // private static Dialog createDialog()
} // public class InfoPanel extends Panel