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