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