360 likes | 477 Views
CS4273: Distributed System Technologies and Programming I. Lecture 2: Introduction to Java and GUI. Important References for Java Manuals. Web site for Java Swing (GUI) http://download.oracle.com/javase/tutorial/uiswing/ Web site for Java Swing Event handler
E N D
CS4273: Distributed System Technologies and Programming I Lecture 2: Introduction to Java and GUI
Important References for Java Manuals • Web site for Java Swing (GUI) http://download.oracle.com/javase/tutorial/uiswing/ • Web site for Java Swing Event handler http://download.oracle.com/javase/tutorial/uiswing/events/index.html • Web site for Java 2 Standard Edition http://www.oracle.com/technetwork/java/javase/overview/index.html • Sample Programs Source codes of demo programs are in unix system: ~jia/www/java/
Java: an Object-Oriented Programming Language Object-Oriented Programming: • Encapsulation • Inheritance • Polymorphism
Class and Method Definition public class dummyButton extends JApplet { String font; int style, size; private JButton bold, italic; public void init() { bold = new JButton("BOLD"); add(bold); add(italic = new JButton("ITALIC")); font = "Helvetica"; style = Font.PLAIN; size = 48; } public void paint(Graphics g) { super.paint(g); g.setFont(new Font(font, style, size)); g.drawString("Hello Java!", 50, 100); } class butnhandler implements ActionListener { public void actionPerformed (ActionEvent e) { ………} • class consists offields and methods: class class-name [extends superclass] [implements interface] { variable declarations; method declarations; } • method declaration: [modifiers] returnT method (args) { statements; }
Object Initialization and Constructor • All variables must be initialized before use. Java automatically sets some initial values for variables of the class, but not variables in methods. • A constructor is a special method, with the same name as the class, for initialization. Java provides an empty & no-argument constructor if a class does not have one. class Rabbit { int Age; Rabbit (int Age) { //constructor this.Age = Age; }//differentiate from the Age in the parameter void run(int duration,boolean zigzag){ ... } } class RabbitGame { public static void main(string[] args) { Rabbit bunny = new Rabbit(3); …. }
Class Inheritance and Method Overriding class Animals { int Age; Animals (int Age) { this.Age = Age; } void wish () { System.out.println ("I want to eat"); } } class Rabbit extends Animals { .. .. .. Rabbit (int Age, char Color) { super(Age); // call super constructor this.Color = Color; } void wish () { // method over-ride super.wish(); // call a super method System.out.println("I want a carrot"); } } Rabbit my_rabbit = new Rabbit(3, ‘B’); my_rabbit.wish(); // ? output ? • When a method has the same name as in the superclass, the method overrides the one in superclass. Otherwise the superclass methods are inherited with no change. • The top class in Java is “object”. Every class is a descendent of object (implicitly inherited). • Keyword super refers to the superclass’ methods or variables.
Object Template static vars, … Modifier: static class Rabbit { static int rabbits_count = 0; int Age; Rabbit (int Age) { rabbits_count++; // access static var this.Age = Age; } static int count() {// only use class variable return rabbits_count; } } • A variable or method defined as static means that the variable or the method belongs to the class, and they are not with objects. • Static variables / methods are class variables / methods. There is only one copy of them in the system. • Class methods can only access class variables. It cannot use “this” reference, cannot call normal methods, etc. But normal methods can access class variables. object object
Modifiers: public, private, protected, final • public: can be used everywhere. • private: can be used only in its own class, not even from its subclass. • protected: can be accessed within its own package. • final defines: • a class can’t be extended • a method can’t be overridden • a variable cannot be modified (constant) final class Rabbit extends Animal { final float = 3.14; …. final int run(int duration, boolean zigzag) { …. } // method 1 }
Abstract Methods and Abstract Classes • An abstract method is a method that has no implementation. It allows subclasses to implement the method according to their own needs. • An abstract class is a class that contains at least one abstract method. • An abstract class must be FULLY implemented before it can be instantiated. abstract class Animals { int Age; Animals (int Age) { this.Age = Age; } abstract void wish (); } class Rabbit extends Animals { .. .. .. void wish () { // implement the abstract method System.out.println("I want a carrot"); } }
Interface and its Implementation • An interface is a class that all its methods are abstract. • There are many interfaces in Java, especially for event handlers, that require implementations. • When defining a class which implements an interface, uses the format: class xxx implements interface { method declaration; ……. method declaration; } • If a class implements some methods of an interface, not all of them, then this class becomes an abstract class.
Graphical User Interface (GUI) Containers and Components • Containers provide a rectangular display area in which components are positioned. A container can also contain other containers. • Components are positioned relative to the top left corner (0,0) of its container and are located using the container’s coordinate space. • Components are added to a container using the add() method.
Containers/Components Containers: JFrame, equivalent to windows. JPanel, applet’s display area is JPanel. It is often used to organize components together in display. Atomic Components: JButtons (JCheckBoxes, JRadioButtons) JComboBox JLabels JTextField (JTextArea) Popup menus ScrollPane
A Simple Example of Buttons public class dummyButton extends JApplet { public void init() { setLayout(new FlowLayout(FlowLayout.CENTER)); bold = new JButton("bold"); add(bold); add(italic = new JButton("italic")); } public void paint(Graphics g) { super.paint(g); g.setFont(new Font(MyFont, MyStyle, MySize)); g.drawString("Hello Java!", 50, 100); } ………..
Listener Object button Java Event Handling Model • When user clicks a button or presses a key, an event is generated. The button clicked is called “event source”. • For each event source, you need to delegate a Listener object to listen to it. • When the listener object hears an event, it invokes a method to process the event. Event bold = new JButton(“bold”); bold.addActionListener(new BtnHandler()); public class BtnHandler implements ActionListener { ……. public void actionPerformed (ActionEvent e) { // code to handler start button } }
Make Buttons Responsive The steps making buttons responsive: • write an event handler which implements interface ActionListener. Interface ActionListener has only one method actionPerformed. • implement method actionPerformed in the interface. • add action listener (your event handler) to each event source. public class dummyButton extends JApplet { public void init() { add(bold = new Button("bold")); bold.addActionListener (new butnhandler()); …. } class butnhandler implements ActionListener { public void actionPerformed (ActionEvent e) { if (e.getSource() == bold) style = Font.BOLD; if (e.getSource() == italic) style = Font.ITALIC; repaint(); } } }
TextField Textfiled is used for getting Text Input from users. • TextField is constructed as: JTextField tf = new JTextField(“input here”, 20); add(tf); • an “action” event is generated when the user types “return” in a TextField. You need to add an event-handler to the JTextField object by: tf.addActionListener (new actionAdapter()); • get the input text by: String InputStr = tf.getText(); • set the text field (for display) by: tf.setText(“wrong input”);
TextArea TextArea is used to display or edit a number of rows and cols. There is no event handler associated with it. It can be used with ScrollPane to make it scrollable. • TextArea can be constructed by: JTextArea ta = new JTextArea(row, col); • display text in a TextArea by: ta.setText(String str); OR ta.append(String str); • get the whole text in TextArea by: ta.getText();
JTextField event is “action” type: // jia/www/java/gui/textField.java public class textFieldTest extends JApplet { JTextField textin, textout; JTextArea textArea; public void init() { setLayout(new FlowLayout()); add(textin = new JTextField("",20)); textin.addActionListener ( new TextHandler ()); textArea = new JTextArea(10,20); add(textArea); add(textout = new JTextField("initial",20)); } class TextHandler implements ActionListener { public void actionPerformed (ActionEvent e){ if (e.getSource() == textin) { textArea.setText(textin.getText()); textout.setText(textin.getText()); } }}} Event handling for TextField
GUI Event Handlings • Action Events. Event sources: • JButton, List, • JTextField, • JMenuItem, etc. • Item Events. Event sources: • JCheckbox, • JButtonGroup (RadioButton), • JComboBox • JChoice (Pop-up menu) • Mouse Events. • Mouse press / release • Mouse drag / move • Key Events • Key press / release • Key typed …………
CheckBox, ButtonGroup (RadioButton) Checkbox allows users to tick (true / false). A checkbox can be used independently. • a Checkbox is created by: new JCheckbox(); ButtonGroup is a group of checkboxes, only one of them can be selected. • a ButtonGroup is created by: g = new ButtonGroup(); • a RadioButton is created & added to Group by: btn = new JRadioButton(); g.add(btn); // add btn to group g • When a checkbox is clicked, an event of type ItemEvent is generated. A handler for ItemEvent type of events implements the interface ItemListener. • Interface ItemListener has only one method itemStateChanged(). You need to implement it. • For each checkbox, an event handler (an object of type addItemListener) should be added to it.
Choice and Event Handler • Choice is a drop-down menu of choices, created by c =Choice(). • A choice item is added in by: c.addItem(“item”); // c is a choice • An “item” event is generated when an item of the Choice is selected and you can get the item by: String e.getItem(); // e is the event • Choice event handler is the same as CheckBox, which implements interface ItemListener. ItemListener has a method itemStateChanged (ItemEvent e). • An event handler object must be added to a Choice (the entire drop-down menu) by: addItemListener()
Mouse Event and Handler • Two interfaces, MouseListener and MouseMotionListener, are for mouse events. Two adapters MouseAdapter and MouseMotionAdapter are provided for the interfaces. You may either implement the interfaces or extend the adapters. • Mouse events include click, press, release, move, drag (press-move), etc. • You need to implement all the methods in interfaces or redefine (override) the necessary methods in adapters. • Add an Adapter object to the window in which you want to catch mouse events.
Event Listener Interface and Adapter • For easy programming, some listener interfaces have Adapter classes, which have default implementations of all methods in the respective interfaces. • If the Adapter of a listener interface is provided, you don’t have to implement the whole interface. You only need to override some methods necessary to perform your work.
//file:mouseDrawAline.java import java.awt.event.*; public class mouseDrawAline extends JApplet { Point start = new Point(0,0), end = new Point(10,10); public void init() { addMouseListener(new myMouseAdapter()); addMouseMotionListener( new myMouseMotionAdapter()); } public void paint(Graphics g) { super.paint(g); // clear existing paintings g.drawLine(start.x, start.y, end.x, end.y); } class myMouseAdapter extends MouseAdapter { public void mousePressed(MouseEvent e) { start.x = e.getX(); start.y = e.getY(); } public void mouseReleased(MouseEvent e) { end.x = e.getX(); end.y = e.getY(); repaint(); } } class myMouseMotionAdapter extends MouseMotionAdapter { public void mouseDragged(MouseEvent e) { end.x = e.getX(); end.y = e.getY(); repaint(); } } Example of Mouse Event Handler
Keyboard Event • The interface for keyboard event handler is KeyListener. • KeyListener has an adapter KeyAdapter. A keyevent handler class can either implement KeyListener interface, or extend KeyAdapter class. • Three methods defined in KeyListener: • keyPressed (keyEvent), called when any key is pressed • keyTyped (keyEvent), called only when a non-function key is pressed • keyReleased (keyEvent), called when a key is released after keyPressed or keyTyped event. • Three methods on keyEvent allows you to get keycode: • event.getKeyCode() • event.getKeyChar(), get printable letter of the key • event.getKeyText(keyCode), get string name of the key
public class keyTest extends JApplet { public void init() { setLayout (new BorderLayout ()); JTextArea textArea = new JTextArea( 30, 30 ); add("Center", textArea); textArea.addKeyListener(new myKeyAdapter()); } class myKeyAdapter extends KeyAdapter { public void keyPressed( KeyEvent event ) { int keycode = event.getKeyCode(); String line = "Key pressed code: "+keycode; line = line+ " & Text: "+ event.getKeyText(keycode); textArea.setText(line+"\n"); } public void keyTyped( KeyEvent event ){ textArea.append("Key typed: "+ event.getKeyChar()+"\n"); } public void keyReleased(KeyEvent event ) { textArea.append("Key released: "+ event.getKeyChar()); } Keyboard Event
Java.lang.object Java.awt.event.ComponenetAdapter Java.awt.event.KeyAdapter Java.awt.event.MouseAdapter Java.awt.event.MouseMotionAdapter Java.awt.event.WindowAdapter Java.awt.event.ContainerAdapter …………….. Event Processing Model in Java: Event Types and Adapters
Event Dispatching • Each component in a container is an object that has two methods, dispathEvent() and processEvent(). • When an event is generated by an external device (mouse, kbd, etc), the out-most container’s dispatchEvent() is invoked, which dispatches the event recursively layer by layer to the right component (i.e., event source). • When a component finds itself is the source of the event, it calls processEvent(e) to process the event. // dispatch an event to the right component void dispatchEvent(AWTEvent e) { …… if (newEventsOnly) { if (eventEnabled(e)) { processEvent(e); } ……. }
Method processEvent() of the component is the root of all of the event-type processing functions. protected void processEvent(AWTEvent e) { if (e instanceof FocusEvent) { processFocusEvent((FocusEvent) e); } elseif (e instanceof MouseEvent) { switch(e.getId()) { case MouseEvent.MOUSE_PRESSED: case MouseEvent.MOUSE_RELEASED: case MouseEvent.MOUSE_CLICKED: case MouseEvent.MOUSE_ENTERED: case MouseEvent.MOUSE_EIXTED: processMouseEvent((MouseEvent)e); break; case MouseEvent.MOUSE_MOVED: case MouseEvent.MOUSE_DRAGGED: processMouseMotionEvent((MouseEvent)e); break; } } else if (e instanceof KeyEvent) { processKeyEvent((KeyEvent)e); } elseif (e instanceof ComponentEvent) { processComponentEvent((CompEvent) e); } } Process Event
MouseMotion Event Handler (example) • Method addMouseMotionListener(mymouseMotionAdapter) does: mouseMotionListener mymouseMotionAdapter • Methods .mouseMoved or .mouseDragged are implemented by you. protected void processMouseMotionEvent(MouseEvent e) { if (mouseMotionListener != null) { int id = e.getId(); switch(id) { case Mouseevent.MOUSE_MOVED: mouseMotionListener.mouseMoved(e); break; case Mouseevent.MOUSE_DRAGGED: mouseMotionListener.mouseDragged(e); break; } } } processEvent processMouseMotionEvent userHandlerObj.mouseMoved
action Event Processing protected void processEvent(AWTEvent e) { if (e instanceof ActionEvent) { processActionEvent((Actionevent) e); return; } super.processEvent(e); } processActionEvent(ActionEvent e) { if (actionListener != null) actionListener.actionPerformed(e); } • Button’s event handler overrides processEvent(). For action event, the code in the right-hand box is executed. • addActionListener(myactionAdapter) does: actionListener myactionAdapter
Window Layout • The default layout manager of content-panes is BorderLayout(); the default layout for JPanel is FlowLayout(); • The default layout manager can be disabled by setLayout(). • The common layouts are FlowLayout, BorderLayout, and GridLayout. • Use JPanel to effectively organize components in different layouts and then arrange the JPanels in top-layer Layouts.
Flow Layout • FlowLayout(align, hgap, vgap); • setLayout(new FlowLayout(FlowLayout.CENTER));
Border Layout • BorderLayout() • To add components into a container with BorderLayout, the add method needs to specify “North”, “South”, “East”, “West”, or “Center”. • The component at the Center automatically fills the whole unoccupied rectangle area from the center.
Grid Layout (Cont.) • GridLayout(rows, cols, hgap, vgap) • When adding components into a frame with GridLayout, it fills the row from left to the right before moving to the next row. • Example of displaying a calculator pad: public class calculator extends JApplet { public void init() { setLayout(new GridLayout(3,4,5,5)); add(new Button(“0”)); …… add(new Button(“9”)); }
Use Panel to Organize Components ~jia/www/java/gui/layoutTest.java