CS 335 Java Programming Swing

CS 335 Java Programming – Swing Java-Based GUI Components      Layout managers Panels Customized panels Menus More layout Simple Layout Mana...
3 downloads 2 Views 2MB Size
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