public abstract class Top extends javax.swing.JFrame implements java.awt.event.WindowFocusListener, StatusHandler
getContentPane().add(component, BorderLayout.CENTER);Derived classes may wish to modify the menus. The File and Help menus are exposed as protected members. The File menu items in the _fileMenuItems protected array are, in order, Open File, Open URL, New, Save, Save As, Print, Close, and Exit. The Help menu items in the _helpMenuItems protected array are, in order, About and Help.
A derived class can use the insert() methods of JMenu to insert a menu item defined by an Action or a JMenuItem into a specified position in the menu. Derived classes can also insert separators using the insertSeparator() method of JMenu. In principle, derived classes can also remove menu items using the remove() methods of JMenu; however, we discourage this. A basic principle of user interface design is habituation, where there is considerable value in having menus that have consistent contents and layout throughout the application (Microsoft, for example, violates this principle with adaptive menus).
Instead of removing items from the menu, they can be disabled. For example, to disable the "Save" item in the File menu, do
_fileMenuItems[3].setEnabled(false);
Some menu items are provided, but are disabled by default. The "New" item, for example, can be enabled with
_fileMenuItems[2].setEnabled(true);A derived class that enables this menu item can populate the menu with submenu items. This particular entry in the _fileMenuItems[2] is a JMenu, not just a JMenuItem, so it can have menu items added to it.
A derived class can add an entirely new menu (many do that). However, at this time, the JMenuBar interface does not support putting a new menu into an arbitrary position. For this reason, derived classes should insert new menus into the menu bar only in the _addMenus() protected method. This ensures that the File menu is always the rightmost menu, and the Help menu is always the leftmost menu. The _addMenus() method is called when the window is first packed.
Modifier and Type | Class and Description |
---|---|
(package private) class |
Top.CenterOnScreenRunnable
A runnable for centering the window on the screen.
|
(package private) class |
Top.CloseWindowAdapter
Listener for windowClosing action.
|
(package private) class |
Top.CloseWindowRunnable
A runnable for closing the window.
|
(package private) static class |
Top.DeferredActionsRunnable
A runnable for executing deferred actions.
|
(package private) class |
Top.DoPackRunnable
A runnable for packing the Window.
|
(package private) class |
Top.FileMenuListener
Listener for file menu commands.
|
(package private) class |
Top.HelpMenuListener
Listener for help menu commands.
|
(package private) class |
Top.HistoryMenuListener
Listener for history menu commands.
|
(package private) class |
Top.SetBackgroundRunnable
A runnable for setting the background color of the status bar.
|
(package private) class |
Top.ShowWindowRunnable
A runnable for showing the window.
|
(package private) class |
Top.StatusBarMessageReportRunnable
A runnable for setting the status bar message for a report.
|
(package private) class |
Top.StatusBarMessageRunnable
A runnable for setting the status bar message.
|
javax.swing.JFrame.AccessibleJFrame
java.awt.Window.AccessibleAWTWindow, java.awt.Window.Type
Modifier and Type | Field and Description |
---|---|
protected static int |
_CANCELED
Indicator that a close operation is canceled.
|
protected boolean |
_debugClosing
Set to true to print closing sequence information to standard
out.
|
protected static java.io.File |
_directory
The most recent directory used in a file dialog.
|
protected static int |
_DISCARDED
Indicator that a file is discarded.
|
protected int |
_exitResult
The return value of the _exit() menu.
|
protected static int |
_EXPORT_MENU_INDEX
Index in the _fileMenuItems array of the Export item.
|
protected static int |
_FAILED
Indicator that a file save failed.
|
protected javax.swing.filechooser.FileFilter |
_fileFilter
The FileFilter that determines what files are displayed by
the Open dialog and the Save As dialog
The initial default is null, which causes no FileFilter to be
applied, which results in all files being displayed.
|
protected javax.swing.JMenu |
_fileMenu
File menu for this frame.
|
protected javax.swing.JMenuItem[] |
_fileMenuItems
Items in the file menu.
|
protected java.io.FilenameFilter |
_filenameFilter
The FileFilter used by the java.awt.FileDialog that determines
what files are displayed by the Open dialog and the Save As
dialog The initial default is null, which causes no FileFilter
to be applied, which results in all files being displayed.
|
protected javax.swing.JMenu |
_helpMenu
Help menu for this frame.
|
protected javax.swing.JMenuItem[] |
_helpMenuItems
Help menu items.
|
protected static int |
_IMPORT_MENU_INDEX
Index in the _fileMenuItems array of the Import item.
|
protected javax.swing.JMenuBar |
_menubar
Menubar for this frame.
|
protected static int |
_NEW_MENU_INDEX
Index in the _fileMenuItems array of the New item.
|
protected static int |
_SAVED
Indicator that a file is saved.
|
protected StatusBar |
_statusBar
The status bar.
|
static long |
MAXIMUM_STATUS_MESSAGE_TIME
Maximum amount of time that a status message is displayed in milliseconds.
|
accessibleContext, EXIT_ON_CLOSE, rootPane, rootPaneCheckingEnabled
CROSSHAIR_CURSOR, DEFAULT_CURSOR, E_RESIZE_CURSOR, HAND_CURSOR, ICONIFIED, MAXIMIZED_BOTH, MAXIMIZED_HORIZ, MAXIMIZED_VERT, MOVE_CURSOR, N_RESIZE_CURSOR, NE_RESIZE_CURSOR, NORMAL, NW_RESIZE_CURSOR, S_RESIZE_CURSOR, SE_RESIZE_CURSOR, SW_RESIZE_CURSOR, TEXT_CURSOR, W_RESIZE_CURSOR, WAIT_CURSOR
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
Constructor and Description |
---|
Top()
Construct an empty top-level frame with the default status
bar.
|
Top(StatusBar statusBar)
Construct an empty top-level frame with the specified status
bar.
|
Modifier and Type | Method and Description |
---|---|
protected void |
_about()
Open a dialog with basic information about this window.
|
protected void |
_addMenus()
Add menus to the menu bar.
|
protected boolean |
_clear()
Clear the current contents.
|
protected boolean |
_close()
Close the window.
|
protected javax.swing.JMenuItem[] |
_createFileMenuItems()
Create the items in the File menu.
|
protected void |
_exit()
Exit the application after querying the user to save data.
|
protected java.io.File |
_getCurrentDirectory()
Return the current directory.
|
protected java.lang.String |
_getName()
Get the name of this object, which in this base class is
either the name of the file that has been associated with this
object, or the string "Unnamed" if none.
|
protected void |
_help()
Display the same information given by _about().
|
protected void |
_open()
Open a file dialog to identify a file to be opened, and then call
_read() to open the file.
|
protected void |
_openURL()
Open a dialog to enter a URL, and then invoke
_read() to open the URL.
|
protected void |
_populateHistory(java.util.List historyList)
Update the submenu with a history list
and add a listener to each line.
|
protected void |
_print()
Print the contents.
|
protected void |
_printCrossPlatform()
Print using the cross platform dialog.
|
protected void |
_printNative()
Print using the native dialog.
|
protected void |
_printPDF()
If a PDF printer is available print to it.
|
protected int |
_queryForSave()
Open a dialog to prompt the user to save the data.
|
protected abstract void |
_read(java.net.URL url)
Read the specified URL.
|
protected boolean |
_save()
Save the model to the current file, if there is one, and otherwise
invoke _saveAs().
|
protected boolean |
_saveAs()
Query the user for a filename and save the model to that file.
|
protected javax.swing.JFileChooser |
_saveAsFileDialog()
Deprecated.
|
protected java.awt.FileDialog |
_saveAsFileDialogComponent()
Create and return a FileDialog for the "Save As" command.
|
protected javax.swing.JFileChooser |
_saveAsJFileChooserComponent()
Create and return a JFileChooser for the "Save As" command.
|
protected void |
_updateHistory(java.lang.String file,
boolean delete)
Add the name of the last file open or set the name to the
first position if already in the list.
|
protected abstract void |
_writeFile(java.io.File file)
Write the model to the specified file.
|
void |
about()
Open a dialog with basic information about this window.
|
void |
centerOnScreen()
Center the window on the screen.
|
void |
close()
Close the window, prompting the user to save changes if there
have been any.
|
static void |
deferIfNecessary(java.lang.Runnable action)
If this method is called in the AWT event dispatch thread,
then simply execute the specified action.
|
void |
dispose()
Dispose of this frame.
|
boolean |
exit()
Exit the application after querying the user to save data.
|
boolean |
getCentering()
Return true if the window is set to be centered when pack() is called.
|
java.awt.Dimension |
getContentSize()
Return the size of the contents of this window.
|
void |
hideMenuBar()
If called before the first time pack() is called, this
method will prevent the appearance of a menu bar.
|
boolean |
isDisposed()
Return true if this frame has been disposed.
|
boolean |
isMenuPopulated()
Return true if the menu of this window has been populated.
|
boolean |
isModified()
Return true if the data associated with this window has been
modified since it was first read or last saved.
|
void |
pack()
Size this window to its preferred size and make it
displayable, and override the base class to populate the menu
bar if the menus have not already been populated.
|
void |
report(java.lang.String message)
Report a message to the user by displaying it in a status bar,
if there is one.
|
void |
report(java.lang.String message,
java.lang.Throwable throwable)
Report a Throwable, which is usually an Exception but can also
be an Error.
|
void |
report(java.lang.Throwable throwable)
Report a Throwable, which is usually an Exception but can also
be an Error.
|
void |
setBackground(java.awt.Color background)
Set background color.
|
void |
setCentering(boolean centering)
Specify whether or not to center the window on the screen when
packing it.
|
static void |
setDirectory(java.io.File dir)
Set the initial default directory.
|
void |
setModified(boolean modified)
Record whether the data associated with this window has been
modified since it was first read or last saved.
|
void |
show()
Override the base class to deiconify
the window, if necessary.
|
void |
status(java.lang.String message)
Display the specified message in the status bar.
|
void |
windowGainedFocus(java.awt.event.WindowEvent event)
Register with the global message handler to receive status messages.
|
void |
windowLostFocus(java.awt.event.WindowEvent event)
Unregister with the global message handler to receive status messages.
|
addImpl, createRootPane, frameInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setIconImage, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
addNotify, getCursorType, getExtendedState, getFrames, getIconImage, getMaximizedBounds, getMenuBar, getState, getTitle, isResizable, isUndecorated, remove, removeNotify, setCursor, setExtendedState, setMaximizedBounds, setMenuBar, setOpacity, setResizable, setShape, setState, setTitle, setUndecorated
addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, hide, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, setVisible, toBack, toFront
add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
public static final long MAXIMUM_STATUS_MESSAGE_TIME
protected static final int _CANCELED
protected static final int _DISCARDED
protected static final int _FAILED
protected static final int _SAVED
protected static java.io.File _directory
protected int _exitResult
protected javax.swing.filechooser.FileFilter _fileFilter
protected java.io.FilenameFilter _filenameFilter
Note that this class can use either java.awt.FileDialog or javax.swing.JFileChooser, so classes should set both _fileFilter and _filenameFilter. Note that it possible to define an inner class that extends javax.swing.filechooser.FileFilter and implements java.io.FilenameFilter and that has two separate accept() methods. This inner class can then be set as the value for both _fileFilter and _filenameFilter:
... MyFileFilter myFileFilter = new MyFileFilter(); _fileFilter = myFileFilter; _filenameFilter = myFileFilter; ... static MyFileFilter extends FileFilter implements FilenameFilter { public boolean accept(File file) { // For FileFilter return true; } public boolean accept(File director, String name) { // For FilenameFilter return true; } public String getDescription() { // For FileFilter return "My filter description."; } }
protected javax.swing.JMenu _fileMenu
protected javax.swing.JMenuItem[] _fileMenuItems
protected static int _NEW_MENU_INDEX
protected static int _IMPORT_MENU_INDEX
protected static int _EXPORT_MENU_INDEX
protected javax.swing.JMenu _helpMenu
protected javax.swing.JMenuItem[] _helpMenuItems
protected javax.swing.JMenuBar _menubar
protected StatusBar _statusBar
protected boolean _debugClosing
public Top()
public Top(StatusBar statusBar)
statusBar
- A status bar, or null to not insert one.public final void about()
_about()
.public void centerOnScreen()
public final void close()
public static void deferIfNecessary(java.lang.Runnable action)
Note that it does not work nearly as well to simply schedule the action yourself on the event thread because if there are a large number of actions, then the event thread will not be able to keep up. By grouping these actions, we avoid this problem.
action
- The Runnable object to execute.public void dispose()
JFrame
.dispose
in class java.awt.Window
public final boolean exit()
_exit()
.public boolean getCentering()
setCentering(boolean)
public java.awt.Dimension getContentSize()
public void hideMenuBar()
public boolean isDisposed()
public boolean isMenuPopulated()
public boolean isModified()
public void pack()
pack
in class java.awt.Window
public void report(java.lang.String message)
message
- The message to report.public void report(java.lang.String message, java.lang.Throwable throwable)
message
- The message.throwable
- The Throwable to report.public void report(java.lang.Throwable throwable)
throwable
- The Throwable to reportreport(String, Throwable)
public void setBackground(java.awt.Color background)
setBackground
in class java.awt.Frame
background
- The background color.public void setCentering(boolean centering)
centering
- Set to false to disable centering.getCentering()
public static void setDirectory(java.io.File dir)
dir
- the initial directory to use for file dialogspublic void setModified(boolean modified)
modified
- Indicator of whether the data has been modified.public void show()
show
in class java.awt.Window
public void status(java.lang.String message)
status
in interface StatusHandler
message
- The message.public void windowGainedFocus(java.awt.event.WindowEvent event)
windowGainedFocus
in interface java.awt.event.WindowFocusListener
event
- The window event.MessageHandler.status(String)
public void windowLostFocus(java.awt.event.WindowEvent event)
windowLostFocus
in interface java.awt.event.WindowFocusListener
event
- The window event.MessageHandler.status(String)
protected void _about()
protected void _addMenus()
JMenu newMenu = new JMenu("My Menu"); _menubar.add(newMenu);The reason for doing this in a protected method rather than doing it directly in the constructor of the base class is subtle. Unfortunately, at this time, Java provides no mechanism for derived classes to insert menus at arbitrary points in the menu bar. Also, the menubar ignores the alignment property of the JMenu. By convention, however, we want the help menu to be the rightmost menu. Thus, we use a strategy pattern here, and call a protected method that derived classes can use to add menus. Thus, this method is called before the Help menu is added, and hence menus added in this method will appear to the left of the Help menu.
protected boolean _clear()
protected boolean _close()
protected javax.swing.JMenuItem[] _createFileMenuItems()
protected void _exit()
protected java.io.File _getCurrentDirectory()
setDirectory(File)
or
_open()
, then the value of the "user.dir"
property is returned.protected java.lang.String _getName()
protected void _help()
protected void _open()
PtGUIUtilities.useFileDialog()
return true, then java.awt.FileDialog is used.
Otherwise, javax.swing.JFileChooser is used.protected void _openURL()
protected void _print()
protected void _printCrossPlatform()
protected void _printPDF() throws java.awt.print.PrinterException
java.awt.print.PrinterException
- If a printer with the string "PDF"
cannot be found or if the job cannot be set to the PDF print
service or if there is another problem printing.protected void _printNative()
protected int _queryForSave()
protected abstract void _read(java.net.URL url) throws java.lang.Exception
url
- The URL to read.java.lang.Exception
- If the URL cannot be read.protected boolean _save()
protected boolean _saveAs()
PtGUIUtilities.useFileDialog()
return true, then java.awt.FileDialog is used.
Otherwise, javax.swing.JFileChooser is used.@Deprecated protected javax.swing.JFileChooser _saveAsFileDialog()
_saveAsJFileChooserComponent()
protected java.awt.FileDialog _saveAsFileDialogComponent()
PtGUIUtilities.useFileDialog()
returns true,
then _saveAs()
uses this method. Otherwise,
_saveAsJFileChooserComponent()
is used.protected javax.swing.JFileChooser _saveAsJFileChooserComponent()
PtGUIUtilities.useFileDialog()
returns false,
then _saveAs()
uses this method. Otherwise,
_saveAsFileDialogComponent()
is used.protected void _populateHistory(java.util.List historyList)
historyList
- The list of history items,
where each element is a String is the name of the
menu item.protected void _updateHistory(java.lang.String file, boolean delete) throws java.io.IOException
file
- name of the file to adddelete
- If true, remove from the history list, otherwise
the file is added to the beginning.java.io.IOException
- If the history file cannot be created, written to,
or saved.protected abstract void _writeFile(java.io.File file) throws java.io.IOException
file
- The file to write to.java.io.IOException
- If the write fails.