Graphical interfaces & event-driven programming

Similar documents
Java: Graphical User Interfaces (GUI)

Introduction to the JAVA UI classes Advanced HCI IAT351

CSE 143. Event-driven Programming and Graphical User Interfaces (GUIs) with Swing/AWT

PROGRAMMING DESIGN USING JAVA (ITT 303) Unit 7

Frames, GUI and events. Introduction to Swing Structure of Frame based applications Graphical User Interface (GUI) Events and event handling

CSE 331. Event-driven Programming and Graphical User Interfaces (GUIs) with Swing/AWT

Introduction to Graphical User Interfaces (GUIs) Lecture 10 CS2110 Fall 2008

CS11 Java. Fall Lecture 4

Jonathan Aldrich Charlie Garrod

Graphics programming. COM6516 Object Oriented Programming and Design Adam Funk (originally Kirill Bogdanov & Mark Stevenson)

Topic 9: Swing. Swing is a BIG library Goal: cover basics give you concepts & tools for learning more

Topic 9: Swing. Why are we studying Swing? GUIs Up to now: line-by-line programs: computer displays text user types text. Outline. 1. Useful & fun!

Outline. Topic 9: Swing. GUIs Up to now: line-by-line programs: computer displays text user types text AWT. A. Basics

CSE 331. Event- driven Programming and Graphical User Interfaces (GUIs) with Swing/AWT

KF5008 Program Design & Development. Lecture 1 Usability GUI Design and Implementation

Graphical User Interfaces (GUIs)

Systems Programming Graphical User Interfaces

All the Swing components start with J. The hierarchy diagram is shown below. JComponent is the base class.

CS11 Java. Fall Lecture 3

Handout 14 Graphical User Interface (GUI) with Swing, Event Handling

Part 3: Graphical User Interface (GUI) & Java Applets

Window Interfaces Using Swing Objects

Swing. By Iqtidar Ali

COMPSCI 230. Software Design and Construction. Swing

CSEN401 Computer Programming Lab. Topics: Graphical User Interface Window Interfaces using Swing

Introduction to GUIs. Principles of Software Construction: Objects, Design, and Concurrency. Jonathan Aldrich and Charlie Garrod Fall 2014

Control Flow: Overview CSE3461. An Example of Sequential Control. Control Flow: Revisited. Control Flow Paradigms: Reacting to the User

Graphical User Interfaces. Swing. Jose Jesus García Rueda

Packages: Putting Classes Together

Java Programming Lecture 6

Window Interfaces Using Swing Objects

GUI Programming. Chapter. A Fresh Graduate s Guide to Software Development Tools and Technologies

CS 251 Intermediate Programming GUIs: Components and Layout

Starting Out with Java: From Control Structures Through Objects Sixth Edition

Swing from A to Z Some Simple Components. Preface

2110: GUIS: Graphical User Interfaces

Introduction to concurrency and GUIs

Chapter 6: Graphical User Interfaces

G51PGP Programming Paradigms. Lecture 008 Inner classes, anonymous classes, Swing worker thread

Part I: Learn Common Graphics Components

CONTENTS. Chapter 1 Getting Started with Java SE 6 1. Chapter 2 Exploring Variables, Data Types, Operators and Arrays 13

Lecture 18 Java Graphics and GUIs

Java & Graphical User Interface II. Wang Yang wyang AT njnet.edu.cn

Lab 4. D0010E Object-Oriented Programming and Design. Today s lecture. GUI programming in

The JFrame Class Frame Windows GRAPHICAL USER INTERFACES. Five steps to displaying a frame: 1) Construct an object of the JFrame class

Graphical User Interfaces. Comp 152

GUI Basics. Object Orientated Programming in Java. Benjamin Kenwright

Graphical User Interface (GUI)

(Incomplete) History of GUIs

Building a GUI in Java with Swing. CITS1001 extension notes Rachel Cardell-Oliver

Java IDE Programming-I

Swing from A to Z Using Focus in Swing, Part 2. Preface

Java Swing. Lists Trees Tables Styled Text Components Progress Indicators Component Organizers

BASICS OF GRAPHICAL APPS

Lecture 5: Java Graphics

Java Swing. based on slides by: Walter Milner. Java Swing Walter Milner 2005: Slide 1

Chapter 8. Java continued. CS Hugh Anderson s notes. Page number: 264 ALERT. MCQ test next week. This time. This place.

MIT AITI Swing Event Model Lecture 17

Heavyweight with platform-specific widgets. AWT applications were limited to commonfunctionality that existed on all platforms.

Java continued. Chapter 8 ALERT ALERT. Last week. MCQ test next week. This time. This place. Closed book. Assignment #2 is for groups of 3

Swing: Building GUIs in Java

CS 251 Intermediate Programming GUIs: Event Listeners

Swing: Building GUIs in Java

Course Status Networking GUI Wrap-up. CS Java. Introduction to Java. Andy Mroczkowski

JAVA NOTES GRAPHICAL USER INTERFACES

PIC 20A GUI with swing

Unit 6: Graphical User Interface

Basicsof. JavaGUI and SWING

To gain experience using GUI components and listeners.

China Jiliang University Java. Programming in Java. Java Swing Programming. Java Web Applications, Helmut Dispert

CSE 331 Software Design & Implementation

AP CS Unit 11: Graphics and Events

INTRODUCTION TO (GUIS)

Graphical User Interface (GUI)

Lecture 9. Lecture

Building Graphical User Interfaces. GUI Principles

Datenbank-Praktikum. Universität zu Lübeck Sommersemester 2006 Lecture: Swing. Ho Ngoc Duc 1

Graphic User Interfaces. - GUI concepts - Swing - AWT

Table of Contents. Chapter 1 Getting Started with Java SE 7 1. Chapter 2 Exploring Class Members in Java 15. iii. Introduction of Java SE 7...

EPITA Première Année Cycle Ingénieur. Atelier Java - J5

encompass a group of features for building Graphical User Interfaces (GUI).

Command-Line Applications. GUI Libraries GUI-related classes are defined primarily in the java.awt and the javax.swing packages.

Charlie Garrod Michael Hilton

Introduction to Graphical Interface Programming in Java. Introduction to AWT and Swing

Java Graphical User Interfaces AWT (Abstract Window Toolkit) & Swing

Introduction. Introduction

Programming Languages and Techniques (CIS120)

Programming Languages and Techniques (CIS120e)

CPS122 Lecture: Graphical User Interfaces and Event-Driven Programming

CS 2113 Software Engineering

Java. GUI building with the AWT

H212 Introduction to Software Systems Honors

Overview. Building Graphical User Interfaces. GUI Principles. AWT and Swing. Constructing GUIs Interface components GUI layout Event handling

Graphical User Interfaces

Chris9an Kästner Charlie Garrod

GUI and its COmponent Textfield, Button & Label. By Iqtidar Ali

Building Graphical User Interfaces. Overview

1.00 Lecture 14. Lecture Preview

Lecture 3: Java Graphics & Events

11/6/15. Objec&ves. RouleQe. Assign 8: Understanding Code. Assign 8: Bug. Assignment 8 Ques&ons? PROGRAMMING PARADIGMS

Transcription:

Graphical interfaces & event-driven programming Lecture 12 of TDA 540 (Objektorienterad Programmering) Carlo A. Furia Alex Gerdes Chalmers University of Technology Gothenburg University Fall 2017

Pop quiz! 1. Go to kahoot.it 2. Enter PIN shown on projector screen 3. Pick a nickname and go!

Polymorphism: reminder of formal definitions More rigorously, polymorphism is a type compatibility rule: If S is a subtype of T, an expression of type S can be used wherever an expression of type T is expected. Since objects of type S are a specialization of objects of type T (a Convertible is a Car!), polymorphism still supports compiler checks and avoids type incompatibility errors. interface List<E> { E get(int index); void add(int index, E e); int size(); } List<String> l; // the following operations are // consistent with the List interface l.add(0, "hej"); l.add(1, " då"); if (l.size() > 0) System.out.println(l.get(0) + l.get(1)); 2 / 35

GUIs: Graphical User Interfaces This class is about programming graphical interfaces (GUIs) in Java. The Java language framework provides an extensive collection of libraries for GUI programming. Thus, programming GUIs means learning how to use those libraries. GUI programming is a domain where object-oriented programming shines: classes model different graphical components (windows, buttons, scroll bars,... ) the relations between components (e.g. different buttons, or a button as a specialized component) are captured by inheritance polymorphism supports flexible reuse of the different components, without worrying about implementation details 3 / 35

More documentation about Java GUIs Some pictures in this class are taken from the detailed Java GUI programming tutorial by Chua Hock Chuan at www3.ntu.edu.sg/home/ehchua/programming/java/j4a_gui.html Another recommended tutorial is the official Java Swing tutorial at http://docs.oracle.com/javase/tutorial/uiswing/index.html As usual, the AWT and Swing API documentations are also useful: https://docs.oracle.com/javase/8/docs/api/javax/swing/ package-summary.html https://docs.oracle.com/javase/8/docs/api/java/awt/ package-summary.html 4 / 35

Graphical components GUI programming relies extensively on the notion of (graphical) components. A component is a class modeling an actual graphical element of the GUI. label text field (content) pane button frame/window scroll bar 5 / 35

AWT vs. Swing AWT (Abstract Windowing Toolkit) and Swing are the two main libraries for GUI programming in Java. We will use mostly Swing, which is newer and has some advantages over AWT. However, every GUI typically needs at least some basic AWT components, and hence we have to learn at least the basics of AWT as well. AWT heavyweight: Java interface to native GUI components implementations may look different on different systems generally faster (native) SWING lightweight: Java GUI components implementations consistent look and feel across different systems slower (implemented in Java) relies on AWT for top-level containers 6 / 35

AWT Historically, first Java library for GUI programming AWT components are Java classes wrapping native libraries on different operating systems (OS X, Windows, GTK+,... ) Platform independent (like all Java), but does not look the same on all systems Swing uses AWT for top-level components, to bootstrap the visualization of the GUI 7 / 35

AWT components AWT classes distinguish between components and containers: each container can include one or several components. 8 / 35

AWT components AWT classes distinguish between components and containers: each container can include one or several components. 8 / 35

AWT in a nutshell AWT is huge: 12 packages, hundreds of classes. Main packages, which are also (partially) used in Swing applications: java.awt: components and containers, and layout managers java.awt.event: event-handling library 9 / 35

Swing components Swing classes have names that start with J, so we can immediately distinguish them from AWT components. 10 / 35

Swing in a nutshell Swing is huge: 18 packages, hundreds of classes. Main package: javax.swing: Swing components and containers Since Swing components are implemented on top of AWT components, you typically need to import some of the libraries from AWT even when developing a pure Swing application. 11 / 35

The structure of Swing GUIs Top-level component: usually JFrame or JDialog Secondary components (containers), used to group and layout simpler components: often JPanel Atomic components, which correspond to the various GUI elements: JButton, JTextField, JTable, JScrollBar,... The layout of the atomic components within the containers is normally done using layout managers, which are introduced independently of the component structure and content. 12 / 35

How to build a Swing frame 1. Create a class that inherits from a top-level component (JFrame) 2. Set up a content pane within the top-level component class 2.1 either get the default content pane from the top-level component 2.2 or create your own JPanel and set it to the top-level component 3. Normally, set a layout manager of the content pane 4. Add components to the content pane 5. Set the top-level frame to visible, and possibly specify other options In all examples use: // basic AWT components, and layout managers import java.awt.*; // event-handling library import java.awt.event.*; // Swing components import javax.swing.*; 13 / 35

A simple Swing frame: version 1 This example uses the default content pane and no layout manager. public class SimpleFrame extends JFrame { protected Container contentpane; SimpleFrame() { // get the default content pane, which is an AWT container contentpane = this.getcontentpane(); // add a text label contentpane.add(new JLabel("I m just a simple frame!")); // close the window when clicking on close setdefaultcloseoperation(jframe.exit_on_close); // resize frame to fit components tightly pack(); // do display the frame! setvisible(true); } } 14 / 35

A simple Swing frame: creating and displaying This is how you can create and display a frame defined by class SimpleFrame from main. public static void main(string[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { } }); } new SimpleFrame(); While we could just create SimpleFrame directly, using invokelater is a better practice that avoids problems when writing more complex GUI applications. 15 / 35

A simple Swing frame: version 2 This example uses a JPanel content pane and a flow layout manager. public class SimpleFrame extends JFrame { protected JPanel contentpane; SimpleFrame() { // set the content pane to a Swing JPanel contentpane = new JPanel(); this.setcontentpane(contentpane); // set a "flow" layout manager contentpane.setlayout(new FlowLayout()); // add a text label, and a button contentpane.add(new JLabel("Hej!")); contentpane.add(new JButton("Click here!")); settitle("frame"); // frame title setsize(200, 50); // fixed size setvisible(true); // do display the frame! } } 16 / 35

A few useful Swing components JLabel: simple text label or picture JButton: clickable button JComboBox: pull-down menu with mutually-exclusive options JList: list of selectable options JTextField: single-line text JTextArea: multi-line text JScrollPane: scroll bar JToolBar: list of clickable buttons (or other components) JOptionPane: pop-up dialog boxes (typically spawned in response to events) 17 / 35

Layout managers Layout managers are AWT facilities (also usable with Swing components) that simplify arranging components in a frame. Layout managers provide flexibility: no absolute positioning, and hence no dependence on the settings of the computer that will display the GUI when the user resizes the frame, layout managers rearrange the components to fit the new frame Each layout manager follows a different criterion to position components as they are added to a frame by calling add. For more complex layouts, nest JPanels at certain positions, and use different layout managers in each nested panel. Setting the layout manager to null contentpane.setlayout(null) uses absolute positioning, where we have to manually specify the coordinates and size of each component. This is usually very tedious, inflexible, and not necessary. 18 / 35

Some examples of layout managers Each layout manager follows a different criterion to position components as they are added to a frame by calling add. FlowLayout (the default of JPanel): add components on a row, left to right; when the row is filled, start a new row below GridLayout: add components in a matrix of fixed dimensions; add left to right, and top to bottom BorderLayout: add each component to one of five fixed zones (north, south, east, west, and center) More layouts shown at http: //docs.oracle.com/javase/tutorial/uiswing/layout/visual.html 19 / 35

Root panes Top-level components such as JFrame are themselves layered into several panes: We have already seen the (default) content pane. The layered pane is to control positioning of the menu bar with respect to the content pane The menu bar is optional, and disabled by default The glass pane is invisible by default; it can be used for adding color or clickable areas across components 20 / 35

Changing the way components look Swing provides a consistent look across platforms, but it also offers the possibility of switching to a customizable look and feel. Metal (or Cross Platform) is the Swing default System is the native look and feel of the operating system running the application (Windows, macos, GTK,... ) Note: use System if you need DPI scaling if text looks too small in high-resolution environments Synth is a customizable look and feel Multiplexing supports using different look and feels for different parts // before everything GUI-related try { UIManager.setLookAndFeel( // set System look & feel UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException InstantiationException IllegalAccessException UnsupportedLookAndFeelException e) { System.out.println("Using default look and feel!"); } 21 / 35

Event-driven programming The programs we have written so far are sequential: statements are executed one after the other, from the entry point in main, according to which conditions occur during execution. However, a GUI must be able to execute statements according to some events that may occur at any time while the program is running: mouse clicks, window resizing, keys pressed,.... Thus, reactive GUIs follow a style of programming called event-driven programming. WHAT HAPPENS An event involving a component occurs The component notifies handlers of the event The handler executes and reacts to the event EXAMPLE A close-window button is clicked The button notifies the window manager The window manager closes the windows 22 / 35

Publish/subscribe communication model Java GUIs support event-driven programming according to the publish/subscribe model. Components are publishers of events. Other objects implement event-handling code specific to a certain event. A handler for an event E subscribes (that is, registers) to a component that publishes events E. Whenever a component triggers an event E, it notifies all handlers for that event that have been registered. A notified handler executes its code in response to the event. Eventually, control returns to the component. 23 / 35

Publish/subscribe event-handling in Java Java GUIs support event-driven programming according to the publish/subscribe model. Swing components include methods of the form addelistener(elistener handler) to register handlers of a specific event E Type EListener corresponds to an interface, whose methods are called whenever the corresponding events are triggered A handler for event E is an object of a subtype of EListener; that is, the handler s class implements interface E Whenever a component triggers an event E, it notifies all handlers for that event that have been registered by calling the proper method of EListener In general, handlers and publishers are completely independent. In practice, they often need to communicate and share state, because handling an event often requires to change some parts of the GUI. 24 / 35

A button that changes text Swing component JButton includes a method addactionlistener(actionlistener handler) to register handlers of the action event (clicking the button). public class ClickableButton extends JFrame { } ClickableButton() { //... // initial text of button JButton button = new JButton("You never clicked!"); //... // CountClicks handler registers with the button button.addactionlistener(new CountClicks(button)) //... } 25 / 35

A button that changes text Interface ActionListener includes a single method actionperformed, called when the corresponding event is triggered (clicking the button). public class CountClicks implements ActionListener { private JButton button; private int count; CountClicks(JButton button) { this.button = button; count = 0; } } // whenever a click occurs public void actionperformed(actionevent evt) { // increment counter count++; // change the button s text button.settext("you clicked " + count + " time(s)"); } 26 / 35

A button that changes text 27 / 35

Some events and listener interfaces LISTENER METHODS COMPONENTS ActionListener actionperformed JButton, JComboBox, JTextField,... FocusListener MouseListener KeyListener InputMethodListener focusgained focuslost mouseclicked mouseclicked mouseentered mouseexited... keypressed keyreleased keytyped caretpositionchanged inputmethodtextchanged JComponent JComponent JComponent JTextComponent 28 / 35

} } 29 / 35 Inner classes The handler class is often coupled with the component s class, and it is very simple (it only implements the listener interface s methods). Java offers anonymous inner classes to supply methods implementations directly where we instantiate the listener. public class ClickableButton extends JFrame { ClickableButton() { //... JButton button = new JButton("You never clicked!"); //... // instantiate an object of the anonymous inner class // which is being defined directly button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { }}); //... button.settext("you clicked!");

Nested classes Anonymous inner classes are just one type of nested classes. A nested class is a class defined inside another class, which may access some of its private data. The opposite of nested class is top-level class: these are the classes we have seen so far. static nested class: no reference to the outer (non-static) instance inner classes: can reference the outer class instance anonymous inner classes: inner class without a name, defined as part of an expression local inner classes: inner class with name, defined as part of an expression 30 / 35

Static nested classes A static nested class: can reference only static members of the enclosing class (besides its own arguments and locals) can itself include both static and non-static members it behaves as a top-level class: nesting affects naming, not behavior public class Top { static class SN { static int five() { return 5; } int three() { return 3; } } } int y = Top.SN.five(); // y == 5 Top.SN o = new Top.SN(); int x = o.three(); // x == 3 31 / 35

Inner classes An inner class: cannot include static members (other than constants) can reference the outer class instance: all instances of the inner class refer to the instance of the outer class used to create them can be created only through an instance of the outer class public class Top { int a; class I { int three() { return 3; } int geta() { return a; } } } Top t = new Top(); Top.I i = new t.new I(); int x = i.three(); // x == 3 t.a = 4; Top.I j = new t.new I(); int y = j.geta(); // y == 4 == i.m() 32 / 35

Anonymous and local inner classes An anonymous or local inner class: cannot include static members (other than constants) can reference the outer class instance: all instances of the inner class refer to the instance of the outer class used to create them cannot access local variables of its enclosing class (except constants) public class ClickableButton extends JFrame { int counter = 0; ClickableButton() { //... button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { button.settext("counter: " + counter); }}); //... } } 33 / 35

Heavy computations in GUIs In event-driven programs such as GUIs, a handler that takes too long to react may compromise the responsiveness of the whole GUI. button.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { } }); // encode 2-hour video in high resolution To avoid this problem, we should allocate such heavy computations to a special executor (thread) in the Java system, which can run the computation in the background without blocking the GUI. 34 / 35

Swing workers We allocate heavy computations to a special executor (thread) in the Java system, which can run the computation in the background without blocking the GUI. SwingWorker worker = new SwingWorker<Void, Void>() { }; @Override public Void doinbackground() { } // encode 2-hour video in high resolution return null; Start the worker s computation: worker.execute() Check whether the worker has finished computing: worker.isdone() (returns boolean) Get the results of the worker s computation after completion: worker.get() 35 / 35