Post on 27-Jan-2016
description
transcript
1
Java Swing - Lecture 3Layout Management
Boriana Koleva(bnk@cs.nott.ac.uk)
G5BUID - Java Swing - 2005
2
Where are we up to?
Last Time:• Containers (Frames and Dialogs)
Hierarchy Root Panes Layered Panes Content Panes Glass Panes
• Components Lots of ‘em…
Today• The exciting topic of “Layout Management”
G5BUID - Java Swing - 2005
3
Laying out components
• Manage realized components• Determine size and position• Each container has a layout manager
(usually)
G5BUID - Java Swing - 2005
4
Layout managers –general aspects
• Creating a layout manager• Consulting managers• Types of managers• Choosing managers• Other features of component layout
• All Covered very well here: http://java.sun.com/docs/books/tutorial/uiswing/layout/
using.html
G5BUID - Java Swing - 2005
5
Creating a layout manager
• Default layout managers JFrame, JDialog, JApplet have BorderLayout JPanel has FlowLayout
Except when used as a Content Pane (Border Layout)
• Setting the layout manager for a container JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
G5BUID - Java Swing - 2005
6
Consulting layout managers (1)
• Consulted automatically when container may need to change its appearance.
• These methods result in consultation, but DON’T trigger new layout add(), remove(), removeAll() getAlignmentX(), getAlignmentY() getPreferredSize(), getMinimumSize(), getMaximumSize()
G5BUID - Java Swing - 2005
7
Consulting layout managers (2)
• These methods actually result in the manager performing layout. JFrame.pack();
Causes this Window to be sized to fit the preferred size and layouts of its subcomponents.
JFrame.show() & JFrame.setVisible(true); Shows the component
JComponent.revalidate(); This method will automatically be called on this component when
a property value changes. Looks for all dependent components and calls validate() on them. Validate() causes a container to lay out its subcomponents again
G5BUID - Java Swing - 2005
8
Layout managers - types
• BorderLayout• BoxLayout• FlowLayout• GridLayout• GridBagLayout• CardLayout
G5BUID - Java Swing - 2005
9
BorderLayout
• Five areas NORTH, SOUTH, EAST, WEST and CENTER Not all areas must be used Do not assume a default area for components Centre gets as much area as possible
• Specify location as argument of add method pane.setLayout(new BorderLayout()); pane.add(new JButton(“Button 1 (NORTH)”), BorderLayout.NORTH);
• Setting gaps between components (default = 0) BorderLayout.setHgap(int gap); BorderLayout.setVgap(int gap); BorderLayout(int horizontalGap, int verticalGap) - Constructor
G5BUID - Java Swing - 2005
10
BoxLayout (1)
• Components on top / next to each other Direction is your choice
• Tries to size components at preferred height for Y_AXIS or width for X_AXIS
• Width as largest component width See above picture
G5BUID - Java Swing - 2005
11
BoxLayout (2)
• Space fillers Rigid - fixed-size space between two components
Glue - taking up no space unless you pull apart the components that it's sticking to. Helps reposition extra space (default is at end)
Custom - Use this to specify a component with whatever minimum, preferred, and maximum sizes you want
G5BUID - Java Swing - 2005
12
BoxLayout (3)
• Component sizes Respect Max, Min and Preferred Sizes of
components
• Alignment Comes into play when not all components are the same width Can specify Left (0), Centre (0.5) or Right (1). Or Top Middle
Bottom
• If you are having layout problems, first treat as an Alignment issue, then examine sizes.
G5BUID - Java Swing - 2005
13
FlowLayout
• Very simple - JPanel’s default• Components in row(s)• At preferred size• Alignment
FlowLayout.LEFT FlowLayout.CENTRE FlowLayout.RIGHT
• Gaps Default = 5 Specifying - setter hGap vGap methods or via
constructor
G5BUID - Java Swing - 2005
14
GridLayout
• Grid of cells - all same size• Components take all space in a cell• Gaps
default = 5 use setter methods hGap and vGap or via arguments to constructor
• Re-sizing Cells resize to be as large as possible in given
window / container
G5BUID - Java Swing - 2005
15
GridBagLayout (1)
• Very flexible (and complex!)• Rows can have different heights• Columns can have different lengths• Uses cells in a grid
GridBagLayout gridbag = new GridBagLayout();GridBagConstraints c = new GridBagConstraints();
JPanel pane = new JPanel();pane.setLayout(gridbag);
//--- For each component to be added to this container://--- ...Create the component...//--- ...Set instance variables in the GridBagConstraints instance...gridbag.setConstraints(theComponent, c);pane.add(theComponent);
G5BUID - Java Swing - 2005
16
GridBagLayout (2)
• Constraints set in an instance of a gridBagConstraints Object gridx and gridy - The row and column of the upper left of the component Anchor - Where to display within cell when component is smaller than it fill - How to size component when cell is larger than components
requested size insets - External padding - min space between component and cell
edges ipadx, ipady - Internal padding - What to add to min size of components weightx and weighty - How to distribute extra space (padding) gridwidth and gridheight - Number of columns or rows the component
uses More explanation here:
http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbagConstraints.html
• Example explained very well here: http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbagExample.html
G5BUID - Java Swing - 2005
17
CardLayout
• Manages objects (usually JPanels) in sets
• Works much like tabbed pane• Choose cards by
Asking for card in order added to container
Going backwards or forwards Specifying card by name
G5BUID - Java Swing - 2005
18
Choosing layout managers (1)
• In order to display a component in as much space as it can get, consider: BorderLayout
Component in centre
GridBagLayout fill=GridBagConstraints.BOTH
BoxLayout Component specifies very large
preferred/maximum sizes
G5BUID - Java Swing - 2005
19
Choosing layout managers (2)
• To display a few components in a compact row: JPanel’s default FlowLayout BoxLayout
• Display a few components of the same size in rows and columns GridLayout
G5BUID - Java Swing - 2005
20
Choosing layout managers (3)
• Display a few components in a row or column, with different spacing between them and custom component sizes BoxLayout
• Display a complex layout that has many components GridBagLayout Using JPanel grouping and hierarchies
G5BUID - Java Swing - 2005
21
Layout managers - other layout features
• Absolute positioning of components When How
• Customising layout managers When How
G5BUID - Java Swing - 2005
22
Absolute positioning (1)
• Don’t do it; unless…
component size isn’t affected by container size or font & look’n’feel changes e.g. desktop panes containing internal frames
custom container performs size & position calculations particular to container e.g. split panes
G5BUID - Java Swing - 2005
23
Absolute positioning (2)
• Key points from NoneWindow.java
Instruct window to use no Layout: .contentPane.setLayout(null);
Set components size and position with XYZ.setBounds(x, y, width, height);
Set window size with: window.setSize(x, y);
G5BUID - Java Swing - 2005
24
Custom layout managers (1)
• Ensure no existing manager does the job GridBagLayout / BoxLayout
Layout manager downloads If your trying to do it, chances are
someone else has done it already…• DECLARE use of external code in
coursework
G5BUID - Java Swing - 2005
25
Custom layout managers (2)
• Create class which implements Layout Manager interface e.g. public class myManager implements LayoutManager
• Must have 5 methods required by interface void addLayoutComponent(String, Component) void removeLayoutComponent(Component) Dimension preferredLayoutSize(Container) Dimension minimumLayoutSize(Container) void layoutContainer(Container)
• See below URL for more documentation http://java.sun.com/docs/books/tutorial/uiswing/layout/custom.html
G5BUID - Java Swing - 2005
26
Summary
• Creating a layout manager• Consulting managers• Types of managers
BorderLayout GridLayout BoxLayout GridBagLayout FlowLayout CardLayout
• Choosing managers• Absolute positioning• Custom layout managers• Next time: Event handling and event listeners