Flylib.com

Books Software

 
 
 

Section 5.10. (Optional) GUI and Graphics Case Study: Drawing Rectangles and Ovals


[Page 213]

5.10. (Optional) GUI and Graphics Case Study: Drawing Rectangles and Ovals

This section introduces two other shapes you can draw using the graphics features in Javarectangles and ovals. To draw rectangles and ovals, we call Graphics methods drawRect and drawOval , respectively, as demonstrated in Fig. 5.26.

Figure 5.26. Drawing a cascade of shapes based on the user 's choice.
(This item is displayed on pages 213 - 214 in the print version)
1

// Fig. 5.26: Shapes.java

2

// Demonstrates drawing different shapes.

3

import

java.awt.Graphics;
 4

import

javax.swing.JPanel;
 5
 6

public class

Shapes

extends

JPanel
 7  {
 8

private int

choice;

// user's choice of which shape to draw

9
10

// constructor sets the user's choice

11

public

Shapes(

int

userChoice )
12     {
13        choice = userChoice;
14     }

// end Shapes constructor

15
16

// draws a cascade of shapes starting from the top left corner

17

public void

paintComponent( Graphics g )
18     {
19

super

.paintComponent( g );
20
21

for

(

int

i =


; i <

10

; i++ )
22        {
23

// pick the shape based on the user's choice

24

switch

( choice )
25           {
26

case


1

:

// draw rectangles

27

g.drawRect(

10

+ i *

10

,

10

+ i *

10,


28


50

+ i *

10

,

50

+ i *

10

);

29

break

;
30

case


2

:

// draw ovals

31

g.drawOval(

10

+ i *

10

,

10

+ i *

10

,

32


50

+ i *

10

,

50

+ i *

10

);

33

break

;
34           }

// end switch

35        }

// end for

36     }

// end method paintComponent

37  }

// end class Shapes


Line 6 begins the class declaration for Shapes , which extends JPanel.Shapes contains one instance variable, choice , declared on line 8, that determines whether paintComponent should draw rectangles or ovals. The Shapes constructor at lines 1114 initializes choice with the value passed in parameter userChoice .

Method paintComponent (lines 1736) performs the actual drawing. Remember, the first statement in every paintComponent method should be a call to super.paintComponent , as in line 19. The for statement (lines 2135) loops 10 times to draw 10 shapes. The switch statement (Lines 2434) chooses between drawing rectangles and drawing ovals.

If choice is 1, then the program draws a rectangle. Lines 2728 call Graphics method drawRect . Method drawRect requires four arguments. The first two arguments represent the x- and y- coordinates of the upper-left corner of the rectangle. The next two represent the width and the height of the rectangle. In this example, we start at a position 10 pixels down and 10 pixels right of the top-left corner, and every iteration of the loop moves the upper-left corner another 10 pixels down and to the right. The width and the height of the rectangle start at 50 pixels and increase by 10 pixels in each iteration.


[Page 214]

If choice is 2, then the program performs a similar operation, drawing an oval instead of a rectangle. When drawing an oval, an imaginary rectangle called a bounding rectangle is created, and an oval that touches the midpoints of all four sides of the bounding rectangle is placed inside. Method drawOval (lines 3132) requires the same four arguments as method drawRect . The arguments specify the position and size of the bounding rectangle for the oval. The values passed to drawOval in this example are exactly the same as the values passed to drawRect in lines 2728. Since the width and height of the bounding rectangle are identical in this example, lines 2728 draw a circle. You may modify the program to draw both rectangles and ovals to see how drawOval and drawRect are related .

Figure 5.27 is responsible for handling input from the user and creating a window to display the appropriate drawing based on the user's response. Line 3 imports JFrame to handle the display, and Line 4 imports JOptionPane to handle the input.

Figure 5.27. Obtaining user input and creating a JFrame to display Shapes .
(This item is displayed on page 215 in the print version)
1

// Fig. 5.27: ShapesTest.java

2

// Test application that displays class Shapes.

3

import

javax.swing.JFrame;
 4

import

javax.swing.JOptionPane;
 5
 6

public class

ShapesTest
 7  {
 8

public static void

main( String args[] )
 9     {
10

// obtain user's choice

11        String input = JOptionPane.showInputDialog(
12

"Enter 1 to draw rectangles\n"

+
13

"Enter 2 to draw ovals"

);
14
15

int

choice = Integer.parseInt( input );

// convert input to int

16
17

// create the panel with the user's input

18        Shapes panel =

new

Shapes( choice );
19
20        JFrame application =

new

JFrame();

// creates a new JFrame

21
22        application.setDefaultCloseOperation(

JFrame.EXIT_ON_CLOSE

);
23        application.add( panel );

// add the panel to the frame

24        application.setSize(

300

,

300

);

// set the desired size

25        application.setVisible(

true

);

// show the frame

26     }

// end main

27  }

// end class ShapesTest



{% if main.adsdop %}{% include 'adsenceinline.tpl' %}{% endif %}

Lines 1113 prompt the user with an input dialog and store the user's response in variable input . Line 15 uses Integer method parseInt to convert the String entered by the user to an int and stores the result in variable choice . An instance of class Shapes is created at line 18, with the user's choice passed to the constructor. Lines 2025 perform the standard operations for creating and setting up a windowcreating a frame, setting it to exit the application when closed, adding the drawing to the frame, setting the frame size and making it visible.


[Page 216]

GUI and Graphics Case Study Exercises

5.1

Draw 12 concentric circles in the center of a JPanel (Fig. 5.28). The innermost circle should have a radius of 10 pixels, and each successive circle should have a radius 10 pixels larger than the previous one. Begin by finding the center of the JPanel . To get the upper-left corner of a circle, move up one radius and to the left one radius from the center. The width and height of the bounding rectangle is the diameter of the circle (twice the radius).

Figure 5.28. Drawing concentric circles.


5.2

Modify Exercise 5.16 from the end-of-chapter exercises to read input using dialogs and to display the bar chart using rectangles of varying lengths.