Subpages: 1. Dialogs and choosers overview
2. Adding an "About" dialog
3. JOptionPane message dialogs
4. Customizing JColorChooser
5. Customizing JFileChooser
14.2 Adding an "About" dialog
Most GUI applications have at least one "About" dialog, usually modal, which often displays copyright, company, and other important information such as product name, version number, authors, etc. The following example illustrates how to add such a dialog to our text editor example developed in chapter 12. We build a sub-class of JDialog, populate it with some simple components, and store it as a variable which can be shown and hidden indefinitely without having to instantiate a new dialog each time it is requested. We also implement centering so that whenever it is shown it will appear in the center of our application's frame.

Figure 14.5 A typical "About" custom JDialog with dynamic centering.
<<file figure14-5.gif>>
The Code: BasicTextEditor.java
see \Chapter14\1
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
public class BasicTextEditor extends JFrame
{
// Unchanged code from section 12.5
protected AboutBox m_dlg;
public BasicTextEditor() {
super("\"About\" BasicTextEditor");
setSize(450, 350);
ImageIcon icon = new ImageIcon("smallIcon.gif");
setIconImage(icon.getImage());
// Unchanged code from section 12.5
updateMonitor();
m_dlg = new AboutBox(this);
setVisible(true);
}
protected JMenuBar createMenuBar() {
// Unchanged code from section12.5
JMenu mHelp = new JMenu("Help");
mHelp.setMnemonic('h');
Action actionAbout = new AbstractAction("About") {
public void actionPerformed(ActionEvent e) {
Dimension d1 = m_dlg.getSize();
Dimension d2 = BasicTextEditor.this.getSize();
int x = Math.max((d2.width-d1.width)/2, 0);
int y = Math.max((d2.height-d1.height)/2, 0);
m_dlg.setBounds(x+BasicTextEditor.this.getX(),
y+ BasicTextEditor.this.getY(),
d1.width, d1.height);
m_dlg.show();
}
};
item = mHelp.add(actionAbout);
item.setMnemonic('a');
menuBar.add(mHelp);
getContentPane().add(m_toolBar, BorderLayout.NORTH);
return menuBar;
}
// Unchanged code
}
class AboutBox extends JDialog
{
public AboutBox(Frame owner) {
super(owner, "About Swing Menu", true);
JLabel lbl = new JLabel(new ImageIcon("con.gif"));
JPanel p = new JPanel();
Border b1 = new BevelBorder(BevelBorder.LOWERED);
Border b2 = new EmptyBorder(5, 5, 5, 5);
lbl.setBorder(new CompoundBorder(b1, b2));
p.add(lbl);
getContentPane().add(p, BorderLayout.WEST);
String message = "Swing Menu sample application\n"+
"Copyright P.Vorobiev, M.Robinson 1998-99";
JTextArea txt = new JTextArea(message);
txt.setBorder(new EmptyBorder(5, 10, 5, 10));
txt.setFont(new Font("Helvetica", Font.BOLD, 12));
txt.setEditable(false);
txt.setBackground(getBackground());
p = new JPanel();
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS));
p.add(txt);
message = "This program demonstrates how to use\n"+
"Swing menus and toolbars";
txt = new JTextArea(message);
txt.setBorder(new EmptyBorder(5, 10, 5, 10));
txt.setFont(new Font("Arial", Font.PLAIN, 12));
txt.setEditable(false);
txt.setBackground(getBackground());
p.add(txt);
getContentPane().add(p, BorderLayout.CENTER);
JButton btOK = new JButton("OK");
ActionListener lst = new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
};
btOK.addActionListener(lst);
p = new JPanel();
p.add(btOK);
getContentPane().add(p, BorderLayout.SOUTH);
pack();
setResizable(false);
}
}
Understanding the Code
Class BasicTextEditor
New instance variable:
AboutBox m_dialog: used to reference an instance of our custom "About" dialog class.
The constructor now assigns a custom icon to the application frame, instantiates an AboutBox, and directs our m_dlg reference to the resulting instance. In this way we can simply show and hide the dialog as necessary, without having to build a new instance each time it is requested. Notice that we use a this reference for its parent because BasicTextEditor extends JFrame.
We also modify the createMenuBar() method by adding a new "Help" menu containing an "About" menu item. This menu item is created as an Action implementation, and its actionPerformed() method determines the dimensions of our dialog as well as where it should be placed on the screen so that it will appear centered relative to its parent.
Class AboutBox
This class extends JDialog to implement our custom "About" dialog. The constructor creates a modal JDialog instance titled "About Swing Menu," and populates it with some simple components. A large icon is placed in the left side and two JTextAreas are placed in the center to display multiline text messages with different fonts. A push button titled "OK" is placed at the bottom. Its ActionListener's actionPerformed() method invokes setVisible(false) when pressed.
Note: We could have constructed a similar "About" dialog using a JOptionPane message dialog. However, the point of this example is to demonstrate the basics of custom dialog creation, which we will be using later in chapter 20 to create several complex custom dialogs that could not be derived from JOptionPane.
Running the Code
Select the "About" menu item which brings up the dialog shown in figure 14.5. This dialog serves only to display information, and has no functionality other than the "OK" button which hides it. Note that no matter where the parent frame lies on the screen, when the dialog is invoked it appears centered. Also note that displaying the dialog is very fast because we are working with the same instance throughout the application's lifetime. This is, in general, a common practice that should be adhered to.



RSS feed Java FAQ News