Professional Documents
Culture Documents
Transparency No. 1
Java GUI
Contents
1. java GUI evolution 2. Swing Components and Containing Hierarchy 3. Layout Management 4. Java Event Model and Event Handling 5. javaBeans Reference: The Java Tutorial on the trail: Creating a GUI with JFC/Swing
Transparency No. 2
Java GUI
Java 1.0 AWT built in 30 days, and it shows Java 1.1 AWT significantly improved, but GUI not finished yet Java 2 Swing: very different, vastly improved This lecture cover Swing only.
Transparency No. 3
Java GUI
Start with the simple approach so you can create basic applications Most of the time this will satisfy your needs If you want to modify the standard elements, you can, but...
Youll have to work harder and learn more A number of big, thick books are available
Transparency No. 4
Java GUI
Swing/JFC
Very easy to add keyboard accelerators, tooltips, graphics Pluggable look and feel Provides ways to change just about everything, but you must work to understand how
Transparency No. 5
Java GUI
Borders Buttons Checkboxes ComboBoxes Image Icons Labels Layered Panes and Internal Frames (MDI) Lists and List Boxes
Menus Popup Menus Radio Buttons Progress Bars Scrolling Support Scrollbars Splitter Control Tabbed Panes
Transparency No. 6
Java GUI
Components and the containment hierarchy Swing Components and the Containment Hierarchy Layout Management Event Handling Painting Threads and Swing More Swing Features and Concepts The Anatomy of a Swing-Based Program
Transparency No. 7
Java GUI
An example:
Java GUI
Transparency No. 9
Java GUI
The code that adds the button and label to the panel, and the panel to the content pane: frame = new JFrame(...); button = new JButton(...); label = new JLabel(...); pane = new JPanel(); pane.add(button); pane.add(label); frame.getContentPane().add(pane, BorderLayout.CENTER);
Transparency No. 10
Java GUI
Top-Level Containers
The components at the top of any Swing containment hierarchy.
General-Purpose Containers
Intermediate containers that can be used under many different circumstances.
Special-Purpose Containers
Intermediate containers that play specific roles in the UI.
Basic Controls
Atomic components that exist primarily to get input from the user; they generally also show simple state.
Transparency No. 11
Java GUI
top-level containers
Transparency No. 12
Java GUI
General-Purpose Containers
JScrollPane
JToolBar
JTabbedPane JSplitPane
Transparency No. 13
Java GUI
Special-Purpose Containers
Root Pane
JLayeredPane
JInternalFrames
Transparency No. 14
Java GUI
Basic Controls
JMenu JMenuItem
Java GUI
Basic Controls
JTextField
JSlider
Transparency No. 16
Java GUI
JProgressBar
JToolTip
Transparency No. 17
Java GUI
JTree
JText
JTable
JColorChooser
Java GUI
TextComponent Font
Color
-layoutMgr
TextArea
TextField
LayoutManager
Button
Canvas
Checkbox
Choice
Label
List
Scrollbar
Transparency No. 19
Java GUI
Layout Management
Transparency No. 20
Java GUI
Java GUI
Event Handling
Every time the user types a character (KeyEvent) or pushes a mouse button( MouseEvent), an event occurs. Any object can be notified of the event.
implement the appropriate interface and be registered as an event listener on the appropriate event source.
Transparency No. 22
Java GUI
Act that results in the event type User clicks a button, presses Return while typing in a ActionListener text field, or chooses a menu item
Listener
User closes a frame (main window) WindowListener User presses a mouse button while the cursor is over a component MouseListener User moves the mouse over a component MouseMotionListener Component becomes visible Transparency No. 23
Java GUI
Transparency No. 24
Java GUI
From now on, every time an event e occurs, the event source object will call the appropriate doXXXAction(e) from l. Threads and Event Handling :
Event-handling code executes in a single thread, the event-dispatching thread. Transparency No. 25 => Event handlers should execute very quickly,
Java GUI
1. 2. 3. 4.
Transparency No. 26
Java GUI
Icons
Actions
Many Swing components -- notably buttons and labels -can display images. You specify these images as Icon objects. provide support for sharing data and state between two or more components that can generate action events. A single program can have any one of several looks and feels. can let the user determine the look and feel, or can specify the look and feel programatically.
Transparency No. 27
Java GUI
The JComponent Class Using Top-Level Containers Using Intermediate Swing Containers Using Atomic Components
Transparency No. 28
Java GUI
Keyboard-generated actions
Java GUI
Transparency No. 30
Java GUI
Handling Events :
add/remove (component, mouse, mouseMotion, key, container, focus) Listenser get/set nextFocusComponent property requestFocus(), hasFocus() boolean contains(int x, int y), contains(Point) Transparency No. 31
Java GUI
Painting Components
void repaint() , repaint(int, int, int, int), repaint(Rectangle) void revalidate() : ReLay out the component and its affected containers. void paintComponent(Graphics)
Java GUI
get/set LayoutManager property: layout get/set Dimension properties: minimumSize, preferredSize, maximumSize get/set float property: allignmentX, allignmentY
Transparency No. 33
Java GUI
Each has a content pane that contains the visible components in the GUI. Can optionally add a menu bar to a toplevel container.
positioned within the top-level container, but outside the content pane.
Transparency No. 34
Java GUI
Transparency No. 35
Java GUI
Transparency No. 36
Java GUI
the code
public static void main(String s[]) { JFrame frame = new JFrame("FrameDemo"); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); //...create a blank label, set its preferred size... frame.getContentPane().add(emptyLabel, BorderLayout.CENTER); frame.pack(); frame.setVisible(true);
Transparency No. 37
Java GUI
JFrame APIs
Transparency No. 38
Java GUI
Panel
The most flexible, frequently used intermediate container.
Scroll Pane
Provides scroll bars around a large or growable component.
Split Pane
Displays two components in a fixed amount of space, letting the user adjust the amount of space devoted to each component.
Tabbed Pane
Contains multiple components but shows only one at a time. The user can easily switch between components.
Transparency No. 39
Java GUI
Internal Frame
Looks like a frame and has much the same API, but must appear within another window.
Layered Pane
Provides a third dimension, depth, for positioning components. You specify the position and size of each component. One type of layered pane, a desktop pane, is designed primarily to contain and manage internal frames.
Root Pane :
Provides behind-the-scenes support to top-level containers.
Transparency No. 40
Java GUI
Transparency No. 41
Java GUI
Adding Components
aFlowPanel.add(aComponent); aFlowPanel.add(anotherComponent); aBorderPanel.add(aComponent, BorderLayout.CENTER); aBorderPanel.add(anotherComponent, BorderLayout.SOUTH);
Transparency No. 42
Java GUI
Constructors: JPanel() , JPanel(LayoutManager) void add(Component [, Object ] [, int ]), void add(String, Component) int getComponentCount() Component getComponent(int) Component[] getComponents() Component getComponentAt( [int, int | Point] ) void remove(Component), void remove(int) , void removeAll() void setLayout(LayoutManager), Transparency No. 43 LayoutManager getLayout()
Java GUI
textArea = new JTextArea(5, 30); JScrollPane scrollPane = new JScrollPane(textArea); ... contentPane.setPreferredSize(new Dimension(400, 100)); ...
Transparency No. 44
Java GUI
Transparency No. 45
Java GUI
the code
//Create a split pane with the two scroll panes in it. splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, listScrollPane, pictureScrollPane); splitPane.setOneTouchExpandable(true); splitPane.setDividerLocation(150); //Provide minimum sizes for the two components in the split pane Dimension minimumSize = new Dimension(100, 50); Transparency No. 46
Java GUI
Transparency No. 47
Java GUI
public ToolBarDemo() { ... JToolBar toolBar = new JToolBar(); addButtons(toolBar); ... JPanel contentPane = new JPanel(); contentPane.setLayout(new BorderLayout()); ... contentPane.add(toolBar, BorderLayout.NORTH); contentPane.add(scrollPane, BorderLayout.CENTER);
Transparency No. 48
Java GUI
protected void addButtons(JToolBar toolBar) { JButton button = null; //first button button = new JButton(new ImageIcon("images/left.gif")); ... toolBar.add(button); //second button button = new JButton(new ImageIcon("images/middle.gif")); ... toolBar.add(button); //third button button = new JButton(new ImageIcon("images/right.gif")); ... toolBar.add(button); } Other methods:
isFloatable(), setFloatable(boolean)
Transparency No. 49
Java GUI
The following atomic components exist primarily to get input from the user: Button, Check Box, Radio Button
Provides easy-to-use, easy-to-customize button implementations.
Combo Box
Provides both uneditable and editable combo boxes -buttons that bring up menus of choices.
List
Displays a group of items that the user can choose.
Menu
Includes menu bar, menu, and menu item implementations, including specialized menu items such as check box menu items.
Slider
Lets the user choose one of a continuous range of values.
Transparency No. 50
Java GUI
Some atomic components exist only to give information: Label : Presents some text, an icon, or both. Progress Bar : Displays progress toward a goal. Tool Tip : Brings up a small window that describes another component. The rest of the atomic components provide formatted information and a way of editing it: Color Chooser : A UI for choosing colors; can be used inside or outside a dialog. File Chooser :A UI for choosing files and directories. Table: An extremely flexible component that displays data in a grid format. Text Support : A framework including everything from simple text components, such as text fields, to
Transparency No. 51
Java GUI
ImageIcon leftButtonIcon = new ImageIcon("images/right.gif") b1 = new JButton("Disable middle button", leftButtonIcon); b1.setVerticalTextPosition(AbstractButton.CE NTER);
position of the text relative to the icon
Java GUI
// can use setText(<html> <.html>) for multiFonts text b1 = new JButton("<html><font size=-1> <b><u>D</u>isable</b> + " middle button</font>", leftButtonIcon);
Transparency No. 53
Java GUI
Transparency No. 54
Java GUI
the code
//In initialization code: chinButton = new JCheckBox("Chin"); chinButton.setMnemonic(KeyEvent.VK_C); chinButton.setSelected(true); glassesButton = new JCheckBox("Glasses"); glassesButton.setMnemonic(KeyEvent.VK_G ); glassesButton.setSelected(true); // Register a listener for the check boxes. CheckBoxListener myListener = new CheckBoxListener();
Transparency No. 55
Java GUI
Radio buttons are groups of buttons in which, by convention, only one button at a time can be selected. Swing release supports radio buttons with the JRadioButton and ButtonGroup classes.
Transparency No. 56
Java GUI
//In initialization code: // Create the radio buttons. JRadioButton birdButton = new JRadioButton(birdString); birdButton.setMnemonic(KeyEvent.VK_B); birdButton.setActionCommand(birdString); birdButton.setSelected(true); // Group the radio buttons. ButtonGroup group = new ButtonGroup(); Transparency No. 57 group.add(birdButton);
Java GUI
// Register a listener for the radio buttons. RadioListener myListener = new RadioListener(); birdButton.addActionListener(myListener); catButton.addActionListener(myListener); dogButton.addActionListener(myListener); rabbitButton.addActionListener(myListener); pigButton.addActionListener(myListener); ... class RadioListener implements ActionListener ... { public void actionPerformed(ActionEvent e) { picture.setIcon(new ImageIcon("images/" + e.getActionCommand() + ".gif")); Transparency No. 58 }
Java GUI
class CheckBoxListener implements ItemListener { public void itemStateChanged(ItemEvent e) { ... Object source = e.getItemSelectable(); if (source == chinButton) { //...make a note of it... } else if (source == glassesButton) { //...make a note of it... } else if (source == hairButton) { //...make a note of it... } else if (source == teethButton) { //...make a note of it... } if (e.getStateChange() == ItemEvent.DESELECTED) //...make a note of it...
Transparency No. 59
Java GUI
ColorChooser
Transparency No. 60
Java GUI
final JLabel banner = new JLabel("Welcome to the Tutorial Zone!", JLabel.CENTER); banner.setForeground(Color.yellow); ... final JColorChooser tcc = new ColorChooser ( banner.getForeground()); // initial selected color ... getContentPane().add(tcc, BorderLayout.CENTER); A color chooser uses an instance of ColorSelectionModel to contain and manage the current selection, which fires a change event whenever the user changes the color
Transparency No. 61
Java GUI
The example program registers a change listener with the color selection model so that it can update the banner at the top of the window. The following code registers and implements the change listener: tcc.getSelectionModel().addChangeListener ( new ChangeListener() { public void stateChanged(ChangeEvent e) { Color newColor = tcc.getColor(); banner.setForeground(newColor);
Transparency No. 62
Java GUI
File Chooser
Transparency No. 63
Java GUI
//Create a file chooser final JFileChooser fc = new JFileChooser(); ... // Event Handler for the OpenFile button public void actionPerformed(ActionEvent e) { // container int returnVal = fc.showOpenDialog(FileChooserDemo.this); //= fc.showDialog(FileChooserDemo.this, OK) // other: fc.ShowSaveDialog() if (returnVal == JFileChooser.APPROVE_OPTION) { // other possibilities: CANCEL_OPTION, ERROR_OPTION File file = fc.getSelectedFile(); //this is where a real application would open the file.
Transparency No. 64
Java GUI
Label
Transparency No. 65
Java GUI
ImageIcon icon = new ImageIcon("images/middle.gif"); ... // 2nd arg sets the position of contents relative to label label1 = new JLabel("Image and Text", icon, JLabel.CENTER); //Set the position of the text, relative to the icon: label1.setVerticalTextPosition(JLabel.BOTTOM); label1.setHorizontalTextPosition(JLabel.CENTER); label2 = new JLabel("Text-Only Label"); label3 = new JLabel(icon); //Add labels to the JPanel. add(label1); add(label2);
Java GUI
The action listener for the button executes this single line of code: theLabel.setText(htmlTextArea.getText());
Transparency No. 67
Java GUI
Combo Boxes
very different forms: uneditable and editable. Uneditable Combo Box: Editable Como Box
Transparency No. 68
Java GUI
String[] petStrings = { "Bird", "Cat", "Dog", "Rabbit", "Pig" }; // Create the combo box, select item at index 4. // Indices start at 0, so 4 specifies the pig. JComboBox petList = new JComboBox(petStrings); petList.setSelectedIndex(4); ... petList.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JComboBox cb = (JComboBox)e.getSource(); String petName = (String)cb.getSelectedItem(); picture.setIcon(new ImageIcon("images/" + petName + ".gif")); } Transparency No. 69 });
Java GUI
String[] patternExamples = { "dd MMMMM yyyy", "dd.MM.yy", "MM/dd/yy", "yyyy.MM.dd G 'at' hh:mm:ss z", "EEE, MMM d, ''yy", "h:mm a", "H:mm:ss:SSS", "K:mm a,z", "yyyy.MMMMM.dd GGG hh:mm aaa" }; ... JComboBox patternList = new JComboBox(patternExamples); patternList.setEditable(true); patternList.addActionListener(...); ... Transparency No. 70
Java GUI
Transparency No. 71
Java GUI
//...where member variables are declared: static Vector imageList; // not limited to Strings // Create the list of images and put it in a scroll pane JList list = new JList(imageList); list.setSelectionMode(ListSelectionModel.SI NGLE_SELECTION); ... JScrollPane listScrollPane = new JScrollPane(list); possible selection modes:
SINGLE_SELECTION
Transparency No. 72
Java GUI
JList fires list selection events whenever the selection changes. You can process these events by adding a list selection listener to the list with the addListSelectionListener method. A list selection listener must implement one method: valueChanged.
Transparency No. 73
Java GUI
public void valueChanged(ListSelectionEvent e) { if (e.getValueIsAdjusting()) return; JList theList = (JList)e.getSource(); if (theList.isSelectionEmpty()) { picture.setIcon(null); } else { int index = theList.getSelectedIndex(); ImageIcon newImage = new ImageIcon("images/" + (String)imageList.elementAt(index)); picture.setIcon(newImage); picture.setPreferredSize(new Dimension( newImage.getIconWidth(), newImage.getIconHeight() )); picture.revalidate(); Transparency No. 74
Java GUI
ListModel listModel = new DefaultListModel(); listModel.addElement("Alison Huml"); listModel.addElement("Kathy Walrath"); listModel.addElement("Lisa Friendly"); listModel.addElement("Mary Campione"); list = new JList(listModel);
Transparency No. 75
Java GUI
public void actionPerformed(ActionEvent e) { int index = list.getSelectedIndex(); // or int[ ] getSelectedIndecies() listModel.remove(index); int size = listModel.getSize(); //Nobody's left, disable firing if (size == 0) { fireButton.setEnabled(false); //Adjust the selection } else { //removed item in last position if (index == listModel.getSize()) index--; //otherwise select same index list.setSelectedIndex(index);
Transparency No. 76
Java GUI
Transparency No. 77
Java GUI
Transparency No. 78
Java GUI
Creating Menus
//in the constructor for a JFrame subclass: JMenuBar menuBar; JMenu menu, submenu; JMenuItem menuItem; JCheckBoxMenuItem cbMenuItem; JRadioButtonMenuItem rbMenuItem; ... //Create the menu bar. menuBar = new JMenuBar(); setJMenuBar(menuBar);
Transparency No. 79
Java GUI
//Build the first menu. menu = new JMenu("A Menu"); menu.setMnemonic(KeyEvent.VK_A); menu.getAccessibleContext().setAccessibleDescripti on( "The only menu in this program that has menu items"); menuBar.add(menu); //a group of JMenuItems
menuItem = new JMenuItem("A text-only menu item", KeyEvent.VK_T); menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_1, ActionEvent.ALT_MASK));
Transparency No. 80 menuItem.getAccessibleContext().setAccessibleDescription(
Java GUI
//a group of radio button menu items menu.addSeparator(); ButtonGroup group = new ButtonGroup(); rbMenuItem = new JRadioButtonMenuItem("A radio button menu item"); rbMenuItem.setSelected(true); rbMenuItem.setMnemonic(KeyEvent.VK_R); group.add(rbMenuItem); menu.add(rbMenuItem); rbMenuItem = new JRadioButtonMenuItem("Another one"); rbMenuItem.setMnemonic(KeyEvent.VK_O); group.add(rbMenuItem);
Transparency No. 81
Java GUI
//a group of check box menu items menu.addSeparator(); cbMenuItem = new JCheckBoxMenuItem("A check box menu item"); cbMenuItem.setMnemonic(KeyEvent.VK_C); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem("Another one"); cbMenuItem.setMnemonic(KeyEvent.VK_H); menu.add(cbMenuItem);
Transparency No. 82
Java GUI
//a submenu menu.addSeparator(); submenu = new JMenu("A submenu"); submenu.setMnemonic(KeyEvent.VK_S); menuItem = new JMenuItem("An item in the submenu"); menuItem.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_2, ActionEvent.ALT_MASK)); submenu.add(menuItem); menuItem = new JMenuItem("Another item"); submenu.add(menuItem); menu.add(submenu); //Build second menu in the menu bar. menu = new JMenu("Another Menu"); menu.setMnemonic(KeyEvent.VK_N);
Transparency No. 83
Java GUI
To detect when the user selects a JMenuItem, you can listen for action events (just as you would for a JButton). To detect when the user selects a JRadioButtonMenuItem, you can listen for either action events or item events. For JCheckBoxMenuItems, you generally listen for item events public class MenuDemo ... implements ActionListener, ItemListener { ...
Transparency No. 84
Java GUI
//Create the popup menu. JPopupMenu popup = new JPopupMenu(); menuItem = new JMenuItem("A popup menu item"); menuItem.addActionListener(this); popup.add(menuItem); menuItem = new JMenuItem("Another popup menu item"); menuItem.addActionListener(this); popup.add(menuItem); //Add listener to components that can bring up popup menus. MouseListener popupListener = new PopupListener();
Transparency No. 85
Java GUI
class PopupListener extends MouseAdapter { public void mousePressed(MouseEvent e) { maybeShowPopup(e); } public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private void maybeShowPopup(MouseEvent e) { if (e.isPopupTrigger()) { popup.show(e.getComponent(), e.getX(), e.getY()); } } }
Transparency No. 86
Java GUI
JTextComponent Hierarchy
Transparency No. 87
Java GUI
Transparency No. 88
Java GUI
// An Example of Using a Text Field JTextField textField = new JTextField(10); textField.setActionCommand(textFieldString); textField.addActionListener(this); //An Example of Using a Password Field JPasswordField passwordField = new JPasswordField(10); passwordField.setActionCommand(passwordFieldStrin g); passwordField.addActionListener(this); // Event handler for both components public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(textFieldString)) { JTextField source = (JTextField)e.getSource(); actionLabel.setText(prefix + source.getText() Transparency No. 89
Java GUI
JTextArea textArea = new JTextArea( "This is an editable JTextArea " + "that has been initialized with the setText method. " + "A text area is a \"plain\" text component, " + "which means that although it can display text " + "in any font, all of the text is in the same font." ); textArea.setFont( new Font("Serif", Font.ITALIC, 16)); Transparency No. 90
Java GUI
JEditorPane
the foundation for Swing's styled text components and provides the mechanism through which you can add support for custom text formats. Using an Editor Pane to Display Text from a URL: JEditorPane editorPane = new JEditorPane(); editorPane.setEditable(false); ...//create a URL object for the TextSamplerDemoHelp.html file... try { editorPane.setPage(url);
Transparency No. 91
Java GUI
JTextPane textPane = new JTextPane(); String[] initString = { /* ... fill array with initial text ... */ }; String[] initStyles = { /* ... fill array with names of styles ... */ }; //Create the styles we need. initStylesForTextPane(textPane); Document doc = textPane.getDocument(); //Load the text pane with styled text. try { for (int i=0; i < initString.length; i++) { doc.insertString(doc.getLength(), initString[i], textPane.getStyle(initStyles[i])); } } catch (BadLocationException ble) { System.err.println("Couldn't insert initial Transparency No. 92
Java GUI
Transparency No. 93
Java GUI
Probably different than other GUIs youve used All code, no resources Components are placed on panel using layout manager based on the order in which you add( ) the components Size, shape and placement quite different depending on layout manager Applet and application window size also affects layout
Transparency No. 94
Java GUI
Types of Layouts
Transparency No. 95
Java GUI
FlowLayout
Components flow onto form left-to-right and top-to-bottom Components take on normal size
Transparency No. 96
Java GUI
The Code
Container contentPane = getContentPane(); contentPane.setLayout(new FlowLayout()); contentPane.add(new JButton("Button 1")); contentPane.add(new JButton("2")); contentPane.add(new JButton("Button 3")); contentPane.add(new JButton("LongNamed Button 4")); Transparency No. 97 contentPane.add(new JButton("Button
Java GUI
Three constructors:
public FlowLayout() public FlowLayout(int alignment) public FlowLayout(int alignment, horizontalGap, int verticalGap)
int
horizontalGap and verticalGap specify the number of pixels to put between components.
default gap value = 5 pixels.
Transparency No. 98
Java GUI
BorderLayout
Container divided into five regions: West, North, East, South, Center.
Transparency No. 99
Java GUI
Example
public class BorderLayout1 extends JApplet { public void init() { Container cp = getContentPane(); cp.setLayout(new BorderLayout()); // default is FlowLayout cp.add(new JButton("North") , BorderLayout.NORTH); // cp.add(BorderLayout.NORTH, new JButton("North")); // also ok! // cp.add(new JButton("North"), North); // also ok! cp.add(BorderLayout.SOUTH, new JButton("South")); cp.add(BorderLayout.EAST, new JButton("East")); cp.add(BorderLayout.WEST, new JButton("West")); cp.add(BorderLayout.CENTER, new Transparency No. 100
Java GUI
methods:
void setHgap(int) void setVgap(int)
Java GUI
GridLayout
Java GUI
The code
Container contentPane = getContentPane(); contentPane.setLayout(new GridLayout(3,2)); contentPane.add(new JButton("Button 1")); contentPane.add(new JButton("2")); contentPane.add(new JButton("Button 3")); contentPane.add(new JButton("LongNamed Button 4")); contentPane.add(new JButton("Button 5")); APIs: public GridLayout(int rows, int columns [, int hgap, int vgap ])
Transparency No. 103
Java GUI
CardLayout
Use JTabbedPane instead. import java.awt.*; public class main extends JApplet implement ActionListner { CardLayout cards = new CardLayout(); JButton b1 = new JButton(one), , b3 = new JButton(three); b1.addActionListner( this); ; b3.addActionListner(this) public void init() { setLayout( cards ); add( new Button("one"), "one" ); add( new Button("two"), "two" ); add( new Button("three"), "three" ); } public void actionPerformed( ActionEvent e) No. 104 flip Transparency { //
Java GUI
CardLayout API
Java GUI
GridBagLayout
Flexible layout manager that aligns components horizontally and vertically, without requiring that the components be the same size Quite a mess to program
Must use GridBagConstraints This is what happens without resources
You can accomplish a lot by combining other layout managers. To make it easier, Swing has BoxLayout
Transparency No. 106
Java GUI
BoxLayout
Place all components in a row or in a column. Much of the benefit of GridBagLayout without the pain Has helper class Box which uses BoxLayout and builds components for you Transparency No. 107
Java GUI
BoxLayout
Java GUI
JPanel(BoxLayout(V))
label
rigidArea(0,5)
Center
JScrollPane South
JButton
Java GUI
The Code
JScrollPane listScroller = new JScrollPane(list); listScroller.setPreferredSize(new Dimension(250, 80)); listScroller.setMinimumSize(new Dimension(250, 80)); listScroller.setAlignmentX(LEFT_ALIGNMENT); ... //Lay out the label and scroll pane from top to bottom. JPanel listPane = new JPanel(); listPane.setLayout(new BoxLayout(listPane, BoxLayout.Y_AXIS)); JLabel label = new JLabel(labelText); listPane.add(label); listPane.add(Box.createRigidArea(new Dimension(0,5)));
Transparency No. 110
Java GUI
// Lay out the buttons from left to right. JPanel buttonPane = new JPanel(); buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.X_AXIS)); buttonPane.setBorder(BorderFactory.createEmptyB order(0, 10, 10, 10)); buttonPane.add(Box.createHorizontalGlue()); buttonPane.add(cancelButton); buttonPane.add(Box.createRigidArea(new Dimension(10, 0))); buttonPane.add(setButton); // Put everything together, using the content pane's BorderLayout. Transparency No. 111
Java GUI
the box layout takes the components alignments and minimum, preferred, and maximum sizes into account. Respect each component's requested minimum and maximum heights. Use preferred height ( or weight ) as default. layout principles:
tries to make all of its container's components equally wide -- as wide as the largest preferred width. container wider => make all the components as wide as the container. If the components aren't all the same width then Transparency No. 112
Java GUI
All componentss AllignmentX are LEFT_ALLIGNMENT(0.0) All componentss AllignmentX are CENTER_ALLIGNMENT(0.5) All componentss AllignmentX are RIGHT_ALLIGNMENT(1.0)
Java GUI
Java GUI
Java GUI
Creating invisible components with Box Type SizeConstrai HowToCreate and Box.Filler.
nt rigidArea horizont al vertical custom Box.createRigidArea(s ize) Box.createHorizontalG lue() Box.createVerticalGlu e() new
Transparency No. 116
glue
Java GUI
Rigid area
Use this when you want a fixed-size space between two components. container.add(firstComponent); container.add(Box.createRigidArea(new Dimension(5,0))); container.add(secondComponent);
Java GUI
Glue
container.add(firstComponent);
container.add(Box.createHorizontalGlue()); container.add(secondComponent);
Java GUI
Custom Box.Filler
// ensure 5~100 pixels b/t components and 100 px height container.add(firstComponent); Dimension minSize = new Dimension(5, 100); Dimension prefSize = new Dimension(5, 100); Dimension maxSize = new Dimension(Short.MAX_VALUE, 100); container.add(new Box.Filler(minSize, prefSize, maxSize)); container.add(secondComponent);
Java GUI
change the minimum, preferred, and maximum sizes in two ways: Invoking setXxxSize method ( defined by the JComponent class).
comp.setMinimumSize(new Dimension(50, 25)); comp.setPreferredSize(new Dimension(50, 25)); comp.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE )); ...//in a subclass of a component class: public Dimension getMaximumSize() { size = getPreferredSize(); size.width = Short.MAX_VALUE; return size;
Transparency No. 120
Java GUI
Constructors:
BoxLayout(Container, int axis) Box(int axies) // create a Box : subclass of Container but not JComponent static Box createHorizontalBox() // = new Box(BoxLayout.X_AXIS) static Box createVerticalBox()
Component createRigidArea(Dimension) Create a rigid lightweight component. Component createHorizontalGlue() Component createVerticalGlue() Component createGlue() Create a glue lightweight component. Horizontal glue and vertical glue can be very useful. Component createHorizontalStrut() Component createVerticalStrut() Create a "strut" Transparency No. 121
Java GUI
setLayout(null); Programmers are responsible for setting the size and position of each component. ( via setBounds(x, y, witdth, height))
Java GUI
The code
public class NoneWindow extends JFrame { ... private boolean laidOut = false; private JButton b1, b2, b3; public NoneWindow() { Container contentPane = getContentPane(); contentPane.setLayout(null); b1 = new JButton("one"); contentPane.add(b1); b2 = new JButton("two"); contentPane.add(b2); b3 = new JButton("three"); contentPane.add(b3); Insets insets = contentPane.getInsets(); b1.setBounds(25 + insets.left, 5 + insets.top, 75, 20);
Transparency No. 123
Java GUI
Event Handling
Each type of event represented by a class Component responds to an event by making an event object and calling each listener registered for that event An event listener implements a particular listener interface using an inner class addXXXListener( ) adds a listener to your component, removeXXXListener( ) unregisters it
Transparency No. 124
Java GUI
Java GUI
Event, listener interface and add-and remove-methods ActionEvent ActionListener ; addActionListener( ) removeActionListener( )
Components supporting this event Button, List, TextField, MenuItem, CheckboxMenuItem, Menu and PopupMenu
AdjustmentEvent Scrollbar, Anything you create that implements AdjustmentListener ; addAdjustmentListener( ) Adjustable removeAdjustmentListener( ) ComponentEvent ComponentListener addComponentListener( )
Event, listener interface and add-and remove-methods ContainerEvent ContainerListener addContainerListener( ) removeContainerListener( ) FocusEvent FocusListener addFocusListener( ) removeFocusListener( )
Java GUI
KeyEvent KeyListener
Java GUI
MouseEvent (for both clicks and Component and its motion) derivatives, including Button, MouseListener; Canvas, Checkbox, Choice, addMouseListener( ) Container, Panel, Applet, ScrollPane, Window,Dialog,FileDialog,Frame,Label, removeMouseListener( )
List, Scrollbar, TextArea and TextField MouseEvent (for both clicks and motion)
Canvas, Checkbox, Choice, Container, Panel, Applet, ScrollPane, Window,Dialog,FileDialog,Frame,Label, List, Scrollbar, TextArea and TextField
WindowEvent WindowListener
Java GUI
listener interface: ItemListener add-and-remove-methods : addItemListener( ), removeItemListener( ) Components supporting this event : Checkbox, CheckboxMenuItem, Choice, List and anything that implements ItemSelectable. listener interface: TextListener add-and-remove-methods : addTextListener( ), removeTextListener( )
Java GUI
Listener interface/ adapter Methods in interface ActionListener actionPerformed(ActionEvent) AdjustmentListener adjustmentValueChanged(AdjustmentEvent) ComponentListener, componentHidden(ComponentEvent) ComponentAdapter componentShown(ComponentEvent) componentMoved(ComponentEvent) componentResized(ComponentEvent)
Transparency No. 130
Java GUI
Listener interface w/ adapter Methods in interface KeyListener, keyPressed(KeyEvent) KeyAdapter keyReleased(KeyEvent) keyTyped(KeyEvent) MouseListener, MouseAdapter mouseClicked(MouseEvent) mouseEntered(MouseEvent) mouseExited(MouseEvent) mousePressed(MouseEvent) mouseReleased(MouseEvent)
Java GUI
Listener interface w/ adapter in interface WindowListener, windowOpened(WindowEvent) WindowAdapter windowClosing(WindowEvent) windowClosed(WindowEvent) windowActivated(WindowEvent)
Methods
windowDeactivated(WindowEvent)
Transparency No. 132
Java GUI
AncestorListner CaretListner, CellEditorListner ChangeListner HyperlinkListner InternalFrameListner ListDataListner ListSelectionListner MenuDragMouseListner, MenuKeyListner,,MenuListner PopupMenuListner TreeExpansionListner, TreeSelectionListner, TreeWillExpandListner java.bean.propertyChangeListner, vetoableChangeListner
Java GUI
JavaBeans
Component programming model True power in visual programming Must be able to instantiate, query and configure objects at design time Java 1.1 reflection provides method and field information on a live object
Methods, arguments, return values
Java GUI
What is a Bean?
Just a class (thus easy to learn & use) Supports three concepts:
Properties Events Methods
Java GUI
Events use the same Listeners, with add- and remove- methods like before
Transparency No. 136
Java GUI
A Simple Bean
class Spots {} public class Frog { private int jumps; private Color color; private Spots spots; private boolean jmpr; public int getJumps() { return jumps; } public void setJumps(int js) { jumps = js; } public Color getColor() { return color; } public void setColor(Color c) { color = c; } public Spots getSpots() { return spots; } public void setSpots(Spots newSpots) { spots = newSpots; }
Transparency No. 137
Java GUI
public boolean isJumper() { return jmpr; } public void setJumper(boolean j) { jmpr = j; } public void addActionListener(ActionListener l) { //... } public void removeActionListener(ActionListener l) { // ... } public void addKeyListener(KeyListener l) { // ... } public void removeKeyListener(KeyListener l) { // ... } // An "ordinary" public method: public void croak() { System.out.println("Ribbet!"); } }
Transparency No. 138
Java GUI
Introspection
Java GUI
Summary
Listener event model and Beans are a big step forward Swing is the best UI library Ive seen All Swing components are JavaBeans Numerous application builders use Beans Beans enable RAD environments Beans support more sophistication than shown here
Java GUI
Summary
Java GUI has gone through a lot of design changes Enough of an intro to get you started Use a GUI builder for serious development Other references:
Core Java 2 by Horstmann & Cornell, Prentice-Hall Online help
Java GUI
Problem 4
1. Create an JFrame with a text field and 3 buttons. When you press each button, make some different text appear in the text field. 2. Add a check box to your JFrame,capture the event and insert different text into the text field. 3. Add a set of radio buttons which change the text in the text field. 4. Add a menu that changes the text field when any of its menu item is selected.
Java GUI
Java GUI
Not detailed:
JDBC, RMI, JavaBeans advanced Swing :Jtree, JTable, JText,
Not covered:
Java Security model Internationalization ( i18n, l10n ) Native Methods, Java 2D, Java 3D, Java mulitmedia framework (JMF) XML, JavaMail
J2EE:
JDBC, RMI, Servlet and JavaServer page, java IDL (Corba), Java Transaction service (JTS), RMI over IIOP, Java Message Queue(JMQ), JNDI, Enterprise JavaBeans
J2ME:
KVM, Configuration: CLDP, profile: MIDP
Transparency No. 144
Java GUI
J2ME
a virtual machine ( KVM, thirdParty: Colored KVM, J9 ) and a set of APIs suitable for providing tailored runtime environments for consumer and embedded electronics. Configurations: low-level APIs and optimized virtual machines targeted at two broad categories of devices: 180K ~512K(CLDC: Connection limited device configuration), and 512K+ profile: a specification that details the JavaTM technology APIs, built on top of and utilizing the
Transparency No. 145