Title: Java Swing - Lecture 3 Layout Management
1Java Swing - Lecture 3Layout Management
- Boriana Koleva
- (bnk_at_cs.nott.ac.uk)
2Where 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
3Laying out components
- Manage realized components
- Determine size and position
- Each container has a layout manager
- (usually)
4Layout 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/la
yout/using.html
5Creating 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())
6Consulting layout managers (1)
- Consulted automatically when container may need
to change its appearance. - These methods result in consultation, but DONT
trigger new layout - add(), remove(), removeAll()
- getAlignmentX(), getAlignmentY()
- getPreferredSize(), getMinimumSize(),
getMaximumSize()
7Consulting 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
8Layout managers - types
- BorderLayout
- BoxLayout
- FlowLayout
- GridLayout
- GridBagLayout
- CardLayout
9BorderLayout
- 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
10BoxLayout (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
11BoxLayout (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
12BoxLayout (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.
13FlowLayout
- Very simple - JPanels 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
14GridLayout
- 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
15GridBagLayout (1)
- Very flexible (and complex!)
- Rows can have different heights
- Columns can have different lengths
- Uses cells in a grid
GridBagLayout gridbag new GridBagLayout() GridB
agConstraints c new GridBagConstraints() JPane
l 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.setConstrai
nts(theComponent, c) pane.add(theComponent)
16GridBagLayout (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/la
yout/gridbagConstraints.html - Example explained very well here
- http//java.sun.com/docs/books/tutorial/uiswing/la
yout/gridbagExample.html
17CardLayout
- 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
18Choosing layout managers (1)
- In order to display a component in as much space
as it can get, consider - BorderLayout
- Component in centre
- GridBagLayout
- fillGridBagConstraints.BOTH
- BoxLayout
- Component specifies very large preferred/maximum
sizes
19Choosing layout managers (2)
- To display a few components in a compact row
- JPanels default FlowLayout
- BoxLayout
- Display a few components of the same size in rows
and columns - GridLayout
20Choosing 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
21Layout managers - other layout features
- Absolute positioning of components
- When
- How
- Customising layout managers
- When
- How
22Absolute positioning (1)
- Dont do it unless
- component size isnt affected by container size
or font looknfeel changes - e.g. desktop panes containing internal frames
- custom container performs size position
calculations particular to container - e.g. split panes
23Absolute 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)
24Custom 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
25Custom 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/la
yout/custom.html
26Summary
- 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