CS 335 Java Programming – Swing
Java-Based GUI Components
Layout managers Panels Customized panels Menus More layout
Simple Layout Managers
Automatic control over component placement according to layout “scheme” API for particular layout scheme provides tunable options
Layout Manager Description
Default for
FlowLayout
sequentially
Applet, Panel, JPanel
BorderLayout
Center, North, South, etc
JApplet, JFrame
GridLayout
Rows and columns
BorderLayout
Default layout manager for the content pane Implements the LayoutManager2 interface Lays out components based on a compass scheme Rules for expansion/filling when components are left out of the compass positions
// Fig. 12.25: BorderLayoutDemo.java // Demonstrating BorderLayout. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class BorderLayoutDemo extends JFrame implements ActionListener { private JButton b[]; private String names[] = { "Hide North", "Hide South", "Hide East", "Hide West", "Hide Center" }; private BorderLayout layout; public BorderLayoutDemo() { super( "BorderLayout Demo" );
layout = new BorderLayout( 5, 5 ); Container c = getContentPane(); c.setLayout( layout ); // instantiate button objects b = new JButton[ names.length ]; for ( int i = 0; i < names.length; i++ ) { b[ i ] = new JButton( names[ i ] ); b[ i ].addActionListener( this ); }
// order not important c.add( b[ 0 ], BorderLayout.NORTH ); c.add( b[ 1 ], BorderLayout.SOUTH ); c.add( b[ 2 ], BorderLayout.EAST ); c.add( b[ 3 ], BorderLayout.WEST ); c.add( b[ 4 ], BorderLayout.CENTER );
// // // // //
North position South position East position West position Center position
setSize( 300, 200 ); show();
} public void actionPerformed( ActionEvent e ) { for ( int i = 0; i < b.length; i++ ) if ( e.getSource() == b[ i ] ) b[ i ].setVisible( false ); else b[ i ].setVisible( true ); // re-layout the content pane layout.layoutContainer( getContentPane() ); }
public static void main( String args[] ) { BorderLayoutDemo app = new BorderLayoutDemo(); app.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); } }
Using Panels
Panels can have their own layout Multiple panels can be added to the container
// Fig. 12.27: PanelDemo.java // Using a JPanel to help lay out components. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class PanelDemo extends JFrame { private JPanel buttonPanel; private JButton buttons[]; public PanelDemo() { super( "Panel Demo" ); Container c = getContentPane(); buttonPanel = new JPanel(); buttons = new JButton[ 5 ]; buttonPanel.setLayout( new GridLayout( 1, buttons.length ) ); for ( int i = 0; i < buttons.length; i++ ) { buttons[ i ] = new JButton( "Button " + (i + 1) ); buttonPanel.add( buttons[ i ] ); }
c.add( buttonPanel, BorderLayout.SOUTH ); setSize( 425, 150 ); show();
} public static void main( String args[] ) { PanelDemo app = new PanelDemo(); app.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); } }
Customizing Panels
Inherit from Panel (can do this with other components of course) Override methods that perform important tasks (e.g., getPreferredSize())
Set Border: setBorder(BorderFactory.createLineBorder(C olor.red));
// Fig. 13.3: SelfContainedPanelTest.java // Creating a self-contained subclass of JPanel // that processes its own mouse events. import java.awt.*; import java.awt.event.*; import javax.swing.*; import com.deitel.jhtp3.ch13.SelfContainedPanel; public class SelfContainedPanelTest extends JFrame { private SelfContainedPanel myPanel; public SelfContainedPanelTest() { myPanel = new SelfContainedPanel(); myPanel.setBackground( Color.yellow ); Container c = getContentPane(); c.setLayout( new FlowLayout() ); c.add( myPanel ); addMouseMotionListener( new MouseMotionListener() { public void mouseDragged( MouseEvent e ) { setTitle( "Dragging: x=" + e.getX() + "; y=" + e.getY() ); }
public void mouseMoved( MouseEvent e ) { setTitle( "Moving: x=" + e.getX() + "; y=" + e.getY() ); } } );
setSize( 300, 200 ); show(); } public static void main( String args[] ) { SelfContainedPanelTest app = new SelfContainedPanelTest(); app.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); } }
// Fig. 13.3: SelfConainedPanel.java // A self-contained JPanel class that // handles its own mouse events. package com.deitel.jhtp3.ch13; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SelfContainedPanel extends JPanel { private int x1, y1, x2, y2;
public SelfContainedPanel() { addMouseListener( new MouseAdapter() { public void mousePressed( MouseEvent e ) { x1 = e.getX(); y1 = e.getY(); }
public void mouseReleased( MouseEvent e ) { x2 = e.getX(); y2 = e.getY(); repaint(); } } ); addMouseMotionListener( new MouseMotionAdapter() { public void mouseDragged( MouseEvent e ) { x2 = e.getX(); y2 = e.getY(); repaint(); } } ); }
public Dimension getPreferredSize() { return new Dimension( 150, 100 ); } public void paintComponent( Graphics g ) { super.paintComponent( g ); g.drawOval( Math.min( x1, x2 ), Math.min( y1, y2 ), Math.abs( x1 - x2 ), Math.abs( y1 - y2 ) ); } }
Menus and JFrame
JMenuBar, JMenuItem, JMenu Objects of classes that provide “setJMenuBar()” are able to support menus: JFrame, JApplet Customization/added functionality: JCheckBoxMenuItem, JRadioButtonMenuItem
Component Hierachy
Example
http://download.oracle.com/javase/tutorial/uiswi ng/components/menu.html
More Layout Options
BoxLayout
http://download.oracle.com/javase/tutorial/uiswing/examples/components/ind ex.html#ListDialog
CardLayout
http://download.oracle.com/javase/tutorial/uiswing/examples/layout/ind ex.html#CardLayoutDemo But, TabbedPane is probably nicer
GridBagLayout
http://download.oracle.com/javase/tutorial/uiswing/layout/gridbag.html