Transcript Lecture 3
Java Swing - Lecture 3
Layout Management
Boriana Koleva
([email protected])
1
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”
2
G5BUID - Java Swing - 2005
Laying out components
• Manage realized components
• Determine size and position
• Each container has a layout manager
(usually)
3
G5BUID - Java Swing - 2005
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
4
G5BUID - Java Swing - 2005
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());
5
G5BUID - Java Swing - 2005
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()
6
G5BUID - Java Swing - 2005
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
7
G5BUID - Java Swing - 2005
Layout managers - types
•
•
•
•
•
•
BorderLayout
BoxLayout
FlowLayout
GridLayout
GridBagLayout
CardLayout
8
G5BUID - Java Swing - 2005
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
9
G5BUID - Java Swing - 2005
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
10
G5BUID - Java Swing - 2005
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
11
G5BUID - Java Swing - 2005
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.
12
G5BUID - Java Swing - 2005
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
13
G5BUID - Java Swing - 2005
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
14
G5BUID - Java Swing - 2005
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);
15
pane.add(theComponent);
G5BUID - Java Swing - 2005
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
16
G5BUID - Java Swing - 2005
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
17
G5BUID - Java Swing - 2005
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
18
G5BUID - Java Swing - 2005
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
19
G5BUID - Java Swing - 2005
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
20
G5BUID - Java Swing - 2005
Layout managers - other layout
features
• Absolute positioning of components
When
How
• Customising layout managers
When
How
21
G5BUID - Java Swing - 2005
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
22
G5BUID - Java Swing - 2005
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);
23
G5BUID - Java Swing - 2005
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
24
G5BUID - Java Swing - 2005
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
25
G5BUID - Java Swing - 2005
Summary
• Creating a layout manager
• Consulting managers
• Types of managers
BorderLayout
BoxLayout
FlowLayout
•
•
•
•
GridLayout
GridBagLayout
CardLayout
Choosing managers
Absolute positioning
Custom layout managers
Next time: Event handling and event listeners
26
G5BUID - Java Swing - 2005