Title: Only to be used in connection with the book "Java the UML Way", by Else Lervik and Vegard B. Havdal.
1Creating User Interfaces
Menues page 2-3 Tollbars page 4 Dialog
windows, introduction page 5-9 An ordinary
OK-Cancel dialog page 10 Trasferring data
between parent window and dialog window page
11-12 The renovation case, a new GUI page
13 GridBagLayout as layout manager page
14-16 Is it possible to control the size of the
components? page 17 The GUI component
JTable page 18-19 The renovation case
GUI page 20
2Menus in General
Youll find MenuLookDemo via JMenu(How to use
Menus) in the online API documentation.
3Menus in this book
- class WindowWithMenu extends JFrame
- private Container guiContainer
- public WindowWithMenu()
- setTitle("MenuTest")
- setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE) - guiContainer getContentPane()
- MenuListener theListener new
MenuListener() - JMenu theMenu new JMenu("Color")
- JMenuItem menuItem new JMenuItem("Yellow")
- theMenu.add(menuItem)
- menuItem.addActionListener(theListener)
- //.. the same for red and blue
- JMenuBar menuBar new JMenuBar()
- menuBar.add(theMenu)
- setJMenuBar(menuBar)
-
- private class MenuListener implements
ActionListener - public void actionPerformed(ActionEvent
event) - String command event.getActionCommand()
JMenuBar
JMenu
JMenuItem
A menu choice generates an ActionEvent.
Solve problem 1, page 457.
4Toolbars
- class WindowWithToolbar extends JFrame
- private Container guiContainer
- private JButton yellowButton
- private JButton redButton
- private JButton blueButton
- public WindowWithToolbar()
- setTitle("Toolbar Test")
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
- guiContainer getContentPane()
- ButtonListener theListener new
ButtonListener() - JToolBar toolbar new JToolBar()
- Icon icon new ImageIcon("yellow.gif")
- yellowButton new JButton(icon)
- yellowButton.addActionListener(theListener)
- toolbar.add(yellowButton)
- // .the same for red and blue
- guiContainer.add(toolbar, BorderLayout.NORTH)
-
- private class ButtonListener implements
ActionListener
JButton
JToolBar
The toolbar in its ordinary place
The toolbar is dragged away from its ordinary
place, becoming a window of its own
5Dialog Windows, an Example
The new name is entered and sent to the primary
window
The name is edited, and the result is sent to the
primary window
6Dialog Windows
- A dialog window is a secondary window, that means
it should always be connected to a parent window. - A modal dialog window prevents the user access to
other windows as long as this window is open. - A nonmodal window is more practical to the user,
but it demands more of the programmer because
more than one window have to be kept updated
synchronously. - In this book we only look at modal dialog
windows.
7The Most Basic Dialog Window
1
2
showDialog()
8The Message Exchange Between the Parent Window
and the Dialog Window
9Summary Making a Modal Dialog Window
Show program listing 15.3, pp. 464-466.
- A dialog window is always a subclass of JDialog.
What we have to provide is a constructor that
calls one of the JDialogs constructors with
modal parameter. If we do not do this, the
constructor with empty parameter list will be
used. And that constructor creates a nonmodal
dialog window. The argument to the modal
parameter has to be true, for example - super(parent, "Minidialog", true)
- Each individual dialog has a method with the name
showDialog() (or something similar). We find the
call setVisible(true) inside the method. - All activity in the dialog has to end with the
call setVisible(false). With this, the dialog is
closed, and the program then goes on to the first
statement after setVisible(true). - Let the dialog window be an instance variable in
the parent window.
Solve the problem, page 475.
10An Ordinary OK Cancel Dialog
- OK means that what the user has done in the
window should apply. - Cancel means that what the user has done in the
window should not apply. - We make a class describing a dialog with these
two buttons, and then our other dialogs may be
subclasses of this class. - The class is named MyDialog and put in the
myLibrary package. - Other functionality
- The class has a method okData(). A subclass may
have its own version of this method. If the user
presses OK, it will not be accepted unless
okData() returns true. - If the user tries to close the window by pressing
in the upper right corner, she will get a
question Do you want input data to be saved?.
If the user answers yes, the window is closed
only if okData() returns true. - Acceleration keys are linked to the buttons. The
Enter key is linked to the OK-button (requires
the OK button having focus). The Escape key is
linked to the Cancel button (independent of
focus).
Show program listing 15.4, pp. 468-470.
11Transferring Data Between a Parent Window and a
Dialog Window
Johnson, John
Johnson, John Peter
12Testing PersonDialog
ParentWindow extends JFrame
PersonDialog extends MyDialog
JOptionPane, this box is displayed if user clicks
the X in the upper right corner
Show program listing 15.5, pp. 471-475.
13The Last Version of the Renovation Case- the
Classes From Chapter 12 With New GUI
JTable
JList
14GridBagLayout as Layout Manager
- GridBagLayout is the most general of all the
layout managers, and often the only applicable. - Its not suited for the trial end error method.
- To use it you have to do a careful planning. Use
pen and paper! - The manager has many parameters, and an error may
give unpredictable results. - First, create a sketch of the window
- Divide the window into rectangular cells by using
vertical and horizontal lines. - Not more than one GUI component in every cell.
- A GUI component may cover more than one cell.
- This sketch makes it possible to state the
requirements of every component.
15An Example
16The Example, cont.
- Container guiContainer getContentPane()
- guiContainer.setLayout(new GridBagLayout()) //
dont forget this! - GridBagConstraints constraints new
GridBagConstraints() - / The following variables are fixed for all
components / - constraints.insets new Insets(5, 5, 5, 5) //
space around and between the components - constraints.weightx 0.5
- constraints.weighty 0.5
- / Then each component has to be handled
according to the table / - / The Toolbar /
- constraints.gridx 0
- constraints.gridy 0
- constraints.gridwidth 4
- constraints.gridheight 1
- constraints.fill GridBagConstraints.NONE
- constraints.anchor GridBagConstraints.WEST
- guiContainer.add(toolbar, constraints)
17Is It Possible to Control the Size of the GUI
Components?
- What about the setSize() method in the Component
class? - Its inherited by all the GUI components.
- Weve used it to set the size of windows.
- For other components, the setSize() method is
only effective if we dont use any layout manager
at all. Then the components are laid out
according to given pixel values. - What about the setMaximumSize(),
setMinimumSize(), and setPreferredSize() methods
in the JComponent class? - They are all inherited by every Swing component.
- BorderLayout and GridLayout do not consider any
of the wishes set up in these methods. - FlowLayout and GridBagLayout consider a
components preferred size. - BoxLayout (see the online API documentation)
considers all these wishes. - All these methods take as argument an instance of
the Dimension class. This class has the following
constructor - Dimension(int width, int height).
- An example list.setPreferredSize(new
Dimension(500, 300))
18The GUI Component JTable
- A class with a lot of possibilities. We limit
ourselves to the following - The table has a fixed number of columns with
fixed column names. - The user can adjust the width of the individual
columns in the table. This results in the other
columns becoming narrower. - The user cant adjust the size of the table (the
overall width and height of the table). - The user cant change the data in the table.
- The program can insert and delete rows in the
table. In order to change the data, the program
can delete a row and insert a new row in its
place. - The user can select individual rows in the table.
The program determines whether or not multiple
rows can be selected, just as with lists. - The program handles the selection by having the
user push a pushbutton, not by listening to row
selections.
19The Data Model Behind
- If the contents of the table are to be changed,
we have to update the data model in the same
way as we did for lists. - Repetition DefaulListModel data new
DefaultlistModel() JList list new
JList(data) data.add(object) // the toString()
method is used when presenting the data - For tables, we use the DefaultTableModel with a
little correction - The default model allows the user to edit the
cells in the table our programs do not handle
this. - We create a subclass of the DefaultTableModel
class where this is prevented - package myLibrary
- import javax.swing.table.
- public class MyTableModel extends
DefaultTableModel - public MyTableModel(String columnNames)
- super(columnNames, 0)
-
- public boolean isCellEditable(int row, int
column) - return false
-
-
20GUI For the Renovation Case
- The file named Dialogs.java
- One dialog window for each of the main objects in
our problem - SurfaceDialog, PaintDialog, WallpaperDialog and
FlooringDialog. - The file named Constants.java
- An interface with named constants used in the
different windows. - Examples are commands, menu items, and text field
lengths. - Classes which need these constants implements the
interface. - The file named RenovationChap15.java
- The primary window
- main()
Show program listings 15.7, 15.8 and 15.9, from
page 484 and so on.