When the user interacts with a GUI component such as clicking on it or holding the mouse down on it and drag the mouse around, the Java Virtual Machine (JVM) fires appropriate "events" and delivers them to the GUI component. It is up to the GUI component to respond to an event. The abstract notion of events is encapsulated in an abstract class called AWTEvent provided by Java. Specific concrete events are represented by appropriate concrete subclasses of AWTEvent.
For example, when the user clicks on the close button of a JFrame, the JVM fres a window event represented by the class WindowEvent and delivers it to the JFrame. By default, the JFrame simply hides itself from the screen while everything else that was created and running before the JFrame disappears from the screen is still alive and running! There is no way the user can redisplay the frame again. In the case when the JFrame is the main window of a GUI app, we should terminate everything when this main frame is closed. The best way to ensure this action is to "register" a special window event "listener" with the JFrame that will call the System class to terminate all threads related to the current program and exit the program. The code looks something like this:
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } });
Every time we write the constructor for a main frame of a GUI app, we invariably find ourselves writing the above lines of code to exit the program plus some additional application specific code to initialize the frame. So, instead of "copy-and-paste" the above code ("opportunistic" re-use), we capture this invariant task in the constructor of an abstract class called AFrame and reuse the code by subclassing from it. The application specific code to initialize the main frame is relegated to the specifc concrete subclass of AFrame and is represented by an abstract method called initialize(). The constructor for AFrame calls initialize(), which, at run-time, is the concrete initialization code of the concrete subclass of AFrame that is being instantiated, as shown below.
public AFrame(String title) { // Always call the superclass's constructor: super(title); addWindowListener(new java.awt.event.WindowAdapter() { public void windowClosing(java.awt.event.WindowEvent e) { System.exit(0); } }); initialize(); }
- 1661 reads