280 likes | 539 Views
Java Swing - Lecture 3 Layout Management. Boriana Koleva (bnk@cs.nott.ac.uk). 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”.
E N D
Java Swing - Lecture 3Layout Management Boriana Koleva (bnk@cs.nott.ac.uk)
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
Laying out components • Manage realized components • Determine size and position • Each container has a layout manager • (usually) 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 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()); 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() 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 G5BUID - Java Swing - 2005
Layout managers - types • BorderLayout • BoxLayout • FlowLayout • GridLayout • GridBagLayout • CardLayout 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 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 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 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. 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 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 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); 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 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 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 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 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 G5BUID - Java Swing - 2005
Layout managers - other layout features • Absolute positioning of components • When • How • Customising layout managers • When • How 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 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); 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 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 G5BUID - Java Swing - 2005
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 G5BUID - Java Swing - 2005