====== User Interface Components and 2D Graphics ====== ---- ===== User Interface and Interactive Components ===== * A good GUI API or package would allow you to ... * Create user interface components * Customize the behavior of the components * group and arrange the controls on the screen * access window manager facilities (e.g., reading image files, printing, and identifying which window is focused) * User interface (WIMP - "Window, Icon, Menu, Pointing device"): * Window * Buttons * Menus * Text boxes * Dialog boxes * Event handling: * Mouse * Keyboard * Focus / window * These are the essentials of writing graphics-based applications ===== The Java Approach ===== * Abstract Window Toolkit (AWT) - Native "peer" code; operating system dependent * Not all platforms support the same widget set (some richer than others) * Different bugs in the AWT user interface library on different platforms * Widgets may have different behaviors on different platforms * Swing - Consistent user experience across platforms; less dependent on underlying platform, as compared to AWT * Many Swing components extend AWT components. * Thus, both the AWT and Swing libraries are necessary (in most cases). * Container - A user interface component that can contain other user interface components such as buttons and text fields * Events * Toolkit - Class that gets system-dependent information (e.g., getting the screen size) ==== The Frame ==== * The top level window (that is, a window that is not contained inside another window) * JFrame (Swing) * JFrame extends the Frame class of AWT * Is a container * Pertinent methods: * setSize() * setLocation() * setTitle() * setIconImage() * setVisible() {{ http://www.javacoder.co.cc/wp-content/uploads/2009/07/upd1.png?200|JFrame-JPanel relationship}} ==== The Panel ==== * JPanel * **The internal structure of a JFrame** * Is a container * **Has a surface onto which you can draw via paint() or paintComponent() methods** * Some Java game developers use Canvas (AWT) instead of JPanel (Swing) * The difference: a JPanel can contain other components while a Canvas cannot * paint() is used for Canvas. * paint() can also be used in JPanel. ==== Swing User Interface Components ==== * JButton * JTextField * JLabel * JCheckBox * JRadioButton * JComboBox * JMenuBar * JPasswordField ==== Event Handling ==== * Event source (the widgets): button, text box, radio button, etc. * In response to mouse movement/click, keyboard press, etc. * Event listener - An object to which a component has delegated the task of handling a particular kind of event * **The event source sends out event objects to all registered listeners when that event occurs.** * The listener objects will then use the information in the event object to determine their reaction to the event. === Handling Mouse Clicking Events === * MouseListener class * MouseEvent * Required methods: * public void mouseClicked(MouseEvent e) * public void mousePressed (MouseEvent e) * public void mouseReleased (MouseEvent e) * public void mouseEntered (MouseEvent e) * public void mouseExited (MouseEvent e) === Handling Keyboard Events === * Require FocusListener, KeyListener classes * KeyEvent * Required methods: * public void keyPressed (KeyEvent e) * public void keyTyped (KeyEvent e) * public void keyReleased (KeyEvent e) * public void focusGained (FocusEvent e) * public void focusLost (FocusEvent e) ----- ===== 2D Graphics ===== ==== Vector vs. Raster Graphics ==== * Vector: * Drawings defined as lines; no curves and limited colors * Benefits: No jagged lines (aliasing); only store endpoints of lines * Examples: Asteroids and Battlezone * Raster: * Screen is made up of pixels * Colors are defined by mixtures of 3 color sources: red, green, and blue (RGB) * Benefits: Can easily draw solid surfaces; cheaper * Drawbacks: More memory-intensive (but memory is cheap); aliasing problems ==== 2D Rendering Primitives ==== * Point * Line * Polygon * Closed (all lines connected) * Defined by a list of vertices ==== Coordinate System ==== * Two coordinate spaces in Java * User space - Where the graphics primitives are defined; device independent * Device space - The coordinate system of an output device, such as a screen, window, or a printer; device dependent * The necessary conversions between user space and device space are performed automatically during rendering ---- ===== 2D Graphics in Java ===== * Links: * http://java.sun.com/docs/books/tutorial/2d/index.html * http://courses.coreservlets.com/Course-Materials/java5.html (follow "Java 2D" link) * Uses older Graphics class but still useful: * http://www.csse.monash.edu.au/~cema/courses/CSE5910/lectureFiles/lecture7b.htm * http://java.sun.com/products/jfc/tsc/articles/painting/ * Graphics class * Introduced in JDK version 1.0 * Methods to draw lines and basic shapes * Very limited drawing options (e.g., cannot vary the line thickness; cannot rotate shapes) * Graphics2D class * A new type of Graphics object: Graphics2D extends Graphics * More sophisticated control over geometry, coordinate transformations, color management, and text layout * Supports shape manipulations * Packages (Java 2D API) * java.awt.* * The main package for the Java Abstract Window Toolkit. * java.awt.geom.* * The Java standard library of two dimensional geometric shapes such as lines, ellipses, and quadrilaterals. * java.awt.font.* * The library for manipulating glyphs in Java. * java.awt.color.* * The library dealing with the many different ways that color can be represented. * java.awt.image.* * The library for manipulating graphical images. * java.awt.print.* * The library of tools for writing to paper. ==== The Java 2D paintComponent() Method in a JPanel ==== public void paintComponent (Graphics g) { Graphics2D g2 = (Graphics2D)g; // This is where you will do your work ... ... } ==== Old Graphics Primitive Methods (That Still Work) ==== * drawLine(int x1, int y1, int x2, int y2) * drawRect(int x, int y, int width, int height) * fillRect(int x, int y, int width, int height) * drawOval(int x, int y, int width, int height) * fillOval(int x, int y, int width, int height) * drawString(String str, int x, int y) * drawPolygon(int[] xPoints, int[] yPoints, int nPoints) * fillPolygon(int[] xPoints, int[] yPoints, int nPoints) * For more, see http://java.sun.com/javase/6/docs/api/java/awt/Graphics.html ==== Colors ==== * Use setColor() or setPaint() * A number of standard colors in Java: * Color.white * Color.red * Color.blue * Color.cyan * Color.green * Or, specify your own color using RGB values * Color(int r, int g, int b) * Color(float r, float g, float b) {{ http://www.csse.monash.edu.au/~cema/courses/CSE5910/lectureFiles/images/lect8a/lect8aGraphicsClassHierarchy.png?250|Class Diagram for (some of) Java's graphics routines}} ==== Graphics2D Primitive Methods ==== * Geometric shapes are organized in an object-oriented fashion * Line2D * Rectangle2D * Ellipse2D * The three classes above implement the Shape interface * **To draw a shape, create an object of a class that implements the Shape interface and then call the draw() or fill() method of the Graphics2D class.** * setStroke() - Set the line width. * Need to create a stroke via BasicStroke() * Rectangle2D.Double(double x, double y, double w, double h) * Rectangle2D.Float(float x, float y, float w, float h) * Ellipse2D.Double(double x, double y, double w, double h) * Ellipse2D.Float(float x, float y, float w, float h) * Point2D.Double(double x, double y) * Line2D.Double(Point2D start, Point2D end) * Line2D.Double(double startX, double startY, double endX, double endY) * Arc2D.Double(double x, double y, double w, double h, double start, double extent, int type) * Arc2D.Float(float x, float y, float w, float h, float start, float extent, int type) * RoundRectangle2D.Double(double x, double y, double w, double h, double arcw, double arch) * RoundRectangle2D.Float(float x, float y, float w, float h, float arcw, float arch) ==== Manipulations and Transformations ==== * translate() - Specify a translation offset in the x and y directions * rotate() - Specify an angle of rotation in radians * shear() - Specify a shearing factor in the x and y directions * scale() - Specify a scaling factor in the x and y directions ==== Moving Pictures ==== * Whether it's this: * {{http://rockhopper.monmouth.edu/~jchung/cs498gd/media/spaceinvaders.gif}} * ... or this: * {{http://rockhopper.monmouth.edu/~jchung/cs498gd/media/Minesweeper_0.gif}} -> {{http://rockhopper.monmouth.edu/~jchung/cs498gd/media/Minesweeper_flag.gif}} * After you've done your painting through paint() or paintComponent() * Repaint: * **repaint() - Force repainting on the screen.** * repaint() causes paintComponent() to be called for all components. ==== Drawing Images (external images, e.g. gif, png, jpg) ==== * Need, at the very least, java.awt.image.* (Image class (AWT)) * drawImage(Image img, int x, int y, ImageObserver observer) ---- ===== Code Samples ===== * [[http://rockhopper.monmouth.edu/~jchung/cs498gd/labs/ui2d/drawLine.java|Draw a red line]] * [[http://rockhopper.monmouth.edu/~jchung/cs498gd/labs/ui2d/moveLine.java|Failed attempt to animate a line]] * [[http://rockhopper.monmouth.edu/~jchung/cs498gd/labs/ui2d/moveStringKb.java|Use keyboard events to move a string around]] ---- ===== Lab Activity - Etch-A-Sketch (tm) emulator? ===== * Purpose: Utilize Java Swing, Graphics2D, and KeyListener to construct an Etch-A-Sketch (tm) emulator. * Introduction * You are to construct an electronic version of a [[http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/20000/0000/900/20939/20939.strip.gif|famous childhood toy]] that draws lineographic images. * Instead of using two knobs to control the drawing stylus, the arrow keys will be moved. * Instructions * In Eclipse, create a new Java project "Sketch" * Download the [[http://rockhopper.monmouth.edu/~jchung/cs498gd/labs/ui2d/moveStringKb.java|template Sketch.java]] into your project folder * The template is partially complete with the application window / frame and key listener implemented. The drawing function(s) are left out. * Additional * Make holding down the shift key produce a longer line. * Update the program so that a press of the spacebar will clear your sketch drawing. * Update the program so it will accept key combinations to draw diagonal lines. * For example: + draws a diagonal line up and to the right. * Of course, it would be simpler to just map a single key to draw a diagonal line, but many games use a combination of the arrow keys to produce certain actions, such as jumping across obstacles. * Links * http://java.sun.com/javase/6/docs/api/java/awt/Image.html (AWT Image Class) * http://java.sun.com/javase/6/docs/api/java/awt/event/InputEvent.html (handling keyboard modifiers, e.g. ) * http://math.hws.edu/eck/cs124/javanotes3/c6/s5.html (something on Java VK_ keycodes) ----