object-oriented software engineering jframes with swing

27
Object-Oriented Software Engineering JFrames with Swing

Upload: corey-campbell

Post on 05-Jan-2016

216 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Object-Oriented Software Engineering JFrames with Swing

Object-Oriented Software Engineering

JFrames with Swing

Page 2: Object-Oriented Software Engineering JFrames with Swing

22UniS

Contents

• JFrame

• Content Pane

• Layout Managers

• Java Interfaces

• ActionListeners

Page 3: Object-Oriented Software Engineering JFrames with Swing

33UniS

JFrameAny interesting GUI will use the JFrame class.

public class FrameDemo { private static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame = new JFrame("FrameDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel emptyLabel = new JLabel(""); emptyLabel.setPreferredSize(new Dimension(175, 100)); frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

frame.pack(); frame.setVisible(true); } public static void main(String[] args) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); }}

Page 4: Object-Oriented Software Engineering JFrames with Swing

44UniS

JFrameprivate static void createAndShowGUI() { JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame = new JFrame("FrameDemo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel emptyLabel = new JLabel(""); emptyLabel.setPreferredSize(new Dimension(175, 100)); frame.getContentPane().add(emptyLabel, BorderLayout.CENTER);

frame.pack(); frame.setVisible(true); }

Page 5: Object-Oriented Software Engineering JFrames with Swing

55UniS

JFrame

Problem is createAndShowGUI is declared static:

private static void createAndShowGUI()

Static methods can not reference any non-static variables.This includes any reference to a non-static class.

This has to be, because main has to be static, and can onlyreference static methods.

Page 6: Object-Oriented Software Engineering JFrames with Swing

66UniS

JFrame

For example, move declaration of frame outside scopeof createAndShowGUI:

private JFrame frame;private static void createAndShowGUI() {

............frame = new JFrame("FrameDemo");............

}

$ javac FrameDemo.javaFrameDemo.java:10: non-static variable frame cannot be referenced from a static context frame = new JFrame("FrameDemo");

Page 7: Object-Oriented Software Engineering JFrames with Swing

77UniS

Content Pane

The menu bar and content pane provide functionalityfor a JFrame.

Page 8: Object-Oriented Software Engineering JFrames with Swing

88UniS

Content Pane, JPanel

public class MyContents extends JPanel {public MyContents ( ) {// put contents of JFrame in this// non-static constructor method}private static void createAndShowGUI() {.....................JFrame frame = new JFrame("Person");.....................MyContents newContentPane = new MyContents( );.....................frame.setContentPane(newContentPane);.....................}

}

Page 9: Object-Oriented Software Engineering JFrames with Swing

99UniS

Layout Managers

A JPanel must have a layout manager to control wherebuttons, icons, text areas etc are to be placed with respect toeach other inside the content pane.

newContentPane LayoutManager

BorderLayout

CardLayout

FlowLayout

GridLayout

GridBagLayout

JPanel

{ choice of } *

*

*

*

*

Page 10: Object-Oriented Software Engineering JFrames with Swing

1010UniS

BorderLayout

Every content pane is initialized to use a BorderLayout.

BorderLayout has five areas. These areas are specified by the BorderLayout constants • PAGE_START, • PAGE_END, • LINE_START, • LINE_END, • and CENTER.

Page 11: Object-Oriented Software Engineering JFrames with Swing

1111UniS

Code for adding buttons to BorderLayout

JButton button = new JButton("Button 1 (PAGE_START)"); newContentPane.add(button, BorderLayout.PAGE_START);

//Make the center component big, since that's the //typical usage of BorderLayout. button = new JButton("Button 2 (CENTER)"); button.setPreferredSize(new Dimension(200, 100)); newContentPane.add(button, BorderLayout.CENTER);

button = new JButton("Button 3 (LINE_START)");newContentPane.add(button, BorderLayout.LINE_START);

button = new JButton("Long-Named Button 4 (PAGE_END)"); newContentPane.add(button, BorderLayout.PAGE_END);

button = new JButton("5 (LINE_END)"); newContentPane.add(button, BorderLayout.LINE_END);

Code taken from Java tutorial, also on course website.

Page 12: Object-Oriented Software Engineering JFrames with Swing

1212UniS

BorderLayout: Note

Behaviour of buttons depends on the object towhich it belongs.

In a later lecture we will see that buttons attached toJToolBar will seem to behave differently when the JToolBar is then attached toa BorderLayout within a JFrame!

Page 13: Object-Oriented Software Engineering JFrames with Swing

1313UniS

BoxLayout

BoxLayout stacks components either as column or in row.

Page 14: Object-Oriented Software Engineering JFrames with Swing

1414UniS

BoxLayout Code

public static void addComponentsToPane(Container pane) { pane.setLayout(new BoxLayout(pane, BoxLayout.Y_AXIS));

addAButton("Button 1", pane); addAButton("Button 2", pane); addAButton("Button 3", pane); addAButton("Long-Named Button 4", pane); addAButton("5", pane); }

private static void addAButton(String text, Container container) { JButton button = new JButton(text); button.setAlignmentX(Component.CENTER_ALIGNMENT); container.add(button); }

Code taken from Java tutorial, also on course website.

Page 15: Object-Oriented Software Engineering JFrames with Swing

1515UniS

GridBagLayout

• GridBagLayout aligns components by placing them within a grid of cells

• Components can span more than one cell.

• The rows in the grid can have different heights, and grid columns can have different widths.

Page 16: Object-Oriented Software Engineering JFrames with Swing

1616UniS

GridBagLayout

Grid (0,0) Grid (0,1) Grid (0,2)

Grid (1,0)

Grid (1,1)

Grid (1,2)

Grid (2,0) Grid (2,1) Grid (2,2)

Page 17: Object-Oriented Software Engineering JFrames with Swing

1717UniS

GridBagLayout

JButton button;

pane.setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

Constraint controls where buttons appear within the GridBagLayout.

Resizing component will causehorizontal space to be sharedacross buttons

Page 18: Object-Oriented Software Engineering JFrames with Swing

1818UniS

GridBagLayout button = new JButton("Button 1"); c.gridx = 0; c.gridy = 0; pane.add(button, c);

button = new JButton("Button 2"); c.gridx = 1; c.gridy = 0; pane.add(button, c);

button = new JButton("Button 3"); c.gridx = 2; c.gridy = 0; pane.add(button, c);

button = new JButton("Long-Named Button 4"); c.ipady = 40; //make this component tall c.weightx = 0.0; c.gridwidth = 3; c.gridx = 0; c.gridy = 1; pane.add(button, c);

Page 19: Object-Oriented Software Engineering JFrames with Swing

1919UniS

GridBagLayout

button = new JButton("5"); c.ipady = 0; //reset to default c.weighty = 1.0; //request any extra vertical space c.anchor = GridBagConstraints.PAGE_END; //bottom of space c.insets = new Insets(10,0,0,0); //top padding c.gridx = 1; //aligned with button 2 c.gridwidth = 2; //2 columns wide c.gridy = 2; //third row pane.add(button, c);

Page 20: Object-Oriented Software Engineering JFrames with Swing

2020UniS

Event ListenersFor a class to provide interaction it might implement the ActionListener and/or the MouseInputListener interfaces in Java as well as extend JPanel.

MyNewClass

«interface» ActionListenerJPanel «interface»

MouseInputListener

JFrame

1

1..*

Page 21: Object-Oriented Software Engineering JFrames with Swing

2121UniS

Java Interfaces

• Interface represents a contract defining a protocol.

• An interface is a named collection of method definitions, without implementations.An interface can also declare constants.

• An interface cannot implement any methods.

• An interface has no constructor.

• All interface methods are public.

• No static methods allowed.

• An interface is not part of the class hierarchy. Unrelated classes can implement the same interface.

• A class can implement many interfaces but can have only one superclass.

Page 22: Object-Oriented Software Engineering JFrames with Swing

2222UniS

MouseInputListener and ActionListener <<interface>>

MouseInputListener

void mouseClicked (MouseEvent)

void mouseMoved (MouseEvent)

void mouseExited (MouseEvent)

void mouseReleased (MouseEvent)

void mouseEntered (MouseEvent)

void mousePressed (MouseEvent)

void mouseDragged (MouseEvent)

void actionPerformed(ActionEvent)

ActionListener

Page 23: Object-Oriented Software Engineering JFrames with Swing

2323UniS

Handling Events

• GUI Components communicate with each other by sending events.

• A listener is an object that is notified when an eventoccurs and can examine the contents of that eventto perform some action.

Event Listener ObjectGUI Component

Eventfired by GUI

Registers to listen for particular type of events

Page 24: Object-Oriented Software Engineering JFrames with Swing

2424UniS

Handling Events

Event Listener ObjectEvent Listener Object

Event Listener ObjectEvent Listener Object

Event Listener ObjectEvent Listener Object

GUI Component

• Any number of objects can register to listen forsame type of event

• Events are multicast to all objects that are• listening

Event

Event

Event

Page 25: Object-Oriented Software Engineering JFrames with Swing

2525UniS

Common Events and their Listeners<<interface>>

java.util.EventListenerjava.awt.AWTEvent

MouseEvent

ActionEvent

<<interface>>

MouseListener

<<interface>>

MouseMotionListener

<<interface>> ActionListener

Page 26: Object-Oriented Software Engineering JFrames with Swing

2626UniS

Listening For Events

aSource aListenerregister( )

anEvent<<create>>

query( )

notify(anEvent )

Page 27: Object-Oriented Software Engineering JFrames with Swing

2727UniS