Except where otherwise noted, the contents of this document are Copyright 2012 Stuart Reges and Marty Stepp.
lab document created by Marty Stepp, Stuart Reges, Whitaker Brand and Hélène Martin
Goals for today:
DrawingPanel
and Java's Graphics
and Color
classesreturn
values to send data between methodsclass mean for a1 (i.e., average score for assignment 1) | / 10 |
9.07 |
class mean for lab1 (i.e., average score for lab 1) | / 2 |
2.0 |
Now we'll explore several exercises related to drawing graphics.
DrawingPanel
that works with Java classes Graphics
(a "pen" for drawing) and Color
.
DrawingPanel.java
to your program directory.
DrawingPanel
, click File, Compare to URL....
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import Java.*; public class PrettyPicture { public static void main(String[] args) { DrawingPanel panel = DrawingPanel(220, 150); setBackgroundColor(Color.YELLOW); Graphics g = panel.Graphics(); panel.setColor(new Color.BLUE); g.drawRectangle(50, 25); g.setColor("RED"); g.fillEllipse(130, 25, 42.1, 40.5); } } |
answer on next slide...
import
statement; should import java.awt.*
new
before 2nd occurrence of DrawingPanel
setBackground
panel.
before setBackground
getGraphics
setColor
method is part of object g
, not panel
new
before Color.BLUE
drawRect
drawRect
(width and height)
Color.RED
, not "RED"
fillOval
import java.awt.*; public class PrettyPicture { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(220, 150); panel.setBackground(Color.YELLOW); Graphics g = panel.getGraphics(); g.setColor(Color.BLUE); g.drawRect(50, 25, 10, 10); g.setColor(Color.RED); g.fillOval(130, 25, 42, 40); } }
Write a complete Java program that draws the following output:
import java.awt.*; public class Face1 { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(220, 150); Graphics g = panel.getGraphics(); g.drawOval(10, 30, 100, 100); // face outline g.setColor(Color.BLUE); g.fillOval(30, 60, 20, 20); // eyes g.fillOval(70, 60, 20, 20); g.setColor(Color.RED); // mouth g.drawLine(40, 100, 80, 100); } }
Consider the output at right. The first stair's top-left corner is at position (5, 5). The first stair is 10x10 px in size. Each stair is 10px wider than the one above it.
Fill in the table below with the coordinates and sizes of the first five stairs. Note which values change and which ones stay the same.
stair | x | y | width | height |
---|---|---|---|---|
1
|
5 |
5 |
10 |
10 |
2
|
5 |
15 |
20 |
10 |
3
|
5 |
25 |
30 |
10 |
4
|
5 |
35 |
40 |
10 |
5
|
5 |
45 |
50 |
10 |
Write a complete Java program to draw the stairs. Copy/paste the code template below into jGRASP and fill in your own expressions or values for each stair's x, y, width, and height.
Use your table from the previous slide to help you find the correct expressions.
The values that change for each stair should become expressions in terms of the loop counter variable, i
.
import java.awt.*; public class Stairs1 { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(110, 110); Graphics g = panel.getGraphics(); for (int i = 0; i < 10; i++) { g.drawRect(x, y, width, height); } } }
Modify your stairs program to draw one (or all) of the following outputs.
Modify only the body in your for
loop.
(You may want to make a new table to find the expressions for x, y, width, and height.)
To get each output, change the for
loop body to the following:
// output 2
g.drawRect(5, 5 + 10*i, 100 - 10*i, 10);
// output 3
g.drawRect(95 - 10*i, 5 + 10*i, 10 + 10*i, 10);
// output 4
g.drawRect(5 + 10*i, 5 + 10*i, 100 - 10*i, 10);
When you want to divide a graphical program into multiple drawing methods, you must pass Graphics g as a parameter in addition to any other parameters. Example:
public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(400, 300); Graphics g = panel.getGraphics(); ... drawStuff(g, 13, 52, 7); } public static void drawStuff(Graphics g, int a, int b, int c) { g.drawLine(a, 45, b, c); ... }
Modify your previous Face
program to draw the following output.
Write a parameterized method that allows you to draw a face at different positions.
import java.awt.*; public class Face2 { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(320, 180); Graphics g = panel.getGraphics(); drawFace(g, 10, 30); drawFace(g, 150, 50); } public static void drawFace(Graphics g, int x, int y) { g.setColor(Color.BLACK); g.drawOval(x, y, 100, 100); g.setColor(Color.BLUE); g.fillOval(x + 20, y + 30, 20, 20); g.fillOval(x + 60, y + 30, 20, 20); g.setColor(Color.RED); g.drawLine(x + 30, y + 70, x + 70, y + 70); } }
Modify your previous Java program to draw the following output.
Use a for
loop with your parameterized method to draw faces at different positions.
import java.awt.*; public class Face3 { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(520, 180); Graphics g = panel.getGraphics(); for (int i = 0; i < 5; i++) { drawFace(g, 10 + i * 100, 30); } } public static void drawFace(Graphics g, int x, int y) { g.setColor(Color.BLACK); g.drawOval(x, y, 100, 100); g.setColor(Color.BLUE); g.fillOval(x + 20, y + 30, 20, 20); g.fillOval(x + 60, y + 30, 20, 20); g.setColor(Color.RED); g.drawLine(x + 30, y + 70, x + 70, y + 70); } }
A return value is when a method sends a value back to the code that called it.
public static type name(parameters) { // declare
...
return expression;
}
variableName = methodName(parameters); // call
Example:
public static double fToC(double tempF) { return (tempF - 32) * 5.0 / 9.0; } ... double bodyTemp = fToC(98.6); // bodyTemp stores 37.0 double freezing = fToC(32); // freezing stores 0.0
Method | Description | Example |
---|---|---|
Math.abs
|
absolute value |
Math.abs(-308) returns 308
|
Math.ceil
|
ceiling (rounds upward) |
Math.ceil(2.13) returns 3.0
|
Math.floor
|
floor (rounds downward) |
Math.floor(2.93) returns 2.0
|
Math.max
|
max of two values |
Math.max(45, 207) returns 207
|
Math.min
|
min of two values |
Math.min(3.8, 2.75) returns 2.75
|
Math.pow
|
power |
Math.pow(3, 4) returns 81.0
|
Math.round
|
round to nearest integer |
Math.round(2.718) returns 3
|
Math.sqrt
|
square root |
Math.sqrt(81) returns 9.0
|
Write the results of each expression.
Use the proper type (.0
for a double
).
Math.ceil(9.17) |
10.0 |
|
Math.pow(2, 4) |
16.0 |
|
Math.sqrt(64) |
8.0 |
|
Math.floor(12.73) + Math.max(8, 5) |
20.0 |
|
Math.abs(Math.min(-1, -3)) |
3 |
|
Math.ceil(Math.random()) |
1.0 |
|
-Math.pow(2, 2) + Math.pow(-2, 3) + Math.pow(2, -2) |
-11.75 |
|
Math.round(4.25) + Math.round(5.38) + Math.round(6.49) |
15 |
Write the results of each expression.
Use the proper type (such as .0
for a double
).
Note that a variable's value changes only if you re-assign it using the =
operator. Discuss any errors you make with your neighbor.
double grade = 2.7; Math.round(grade); // grade = 2.7 grade = Math.round(grade); // grade = 3.0 double min = Math.min(grade, Math.floor(2.9)); // min = 2.0 double x = Math.pow(2, 4); // x = 16.0 x = Math.sqrt(64); // x = 8.0 int count = 25; Math.sqrt(count); // count = 25 count = (int) Math.sqrt(count); // count = 5 int a = Math.abs(Math.min(-1, -3)); // a = 3
lastDigit
that returns the last digit
of an integer. For example, lastDigit(3572)
should
return 2
. It should work for negative numbers as well. For
example, lastDigit(-947)
should return 7
.
Consider the following method for converting milliseconds into days:
// converts milliseconds to days public static double toDays(double millis) { return millis / 1000.0 / 60.0 / 60.0 / 24.0; }
Write a similar method named area
that takes as a parameter the radius of a circle and that returns the area of the circle.
For example, the call area(2.0)
should return 12.566370614359172
.
Recall that area can be computed as π times the radius squared and that Java has a constant called Math.PI
.
Write a method named pay
that accepts two parameters: a real number for a TA's salary, and an integer for the number of hours the TA worked this week.
The method should return how much money to pay the TA.
For example, the call pay(5.50, 6)
should return 33.0
.
The TA should receive "overtime" pay of 1 ½ normal salary for any hours above 8.
For example, the call pay(4.00, 11)
should return (4.00 * 8) + (6.00 * 3) or 50.0
.
printPowersOf2
to print out the powers of 2 up to 2x.
It should take a parameter that determines x; that is, the exponent of the highest power of 2 to be printed.
For example, the following call:
printPowersOf2(10);
should produce the following output, because 210 = 1024:
1 2 4 8 16 32 64 128 256 512 1024
main
method.
Call your method several times in main
to ensure that it works.
Also check your answer using Practice-It by clicking the check-mark icon above.
n
printPowersOfN
that prints the powers of any given
number n up to n^x. For example, the
following call:
printPowersOfN(3, 5);should produce the following output, because 35 = 243:
1 3 9 27 81 243and the call:
printPowersOfN(2, 10);should produce the same output as
printPowersOf2(10);
:
1 2 4 8 16 32 64 128 256 512 1024
Write a Java program that draws the following output using a for
loop.
import java.awt.*; public class Spiral { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(170, 170); Graphics g = panel.getGraphics(); for (int i = 0; i < 8; i++) { g.drawLine( 10*i, 10 + 10*i, 160 - 10*i, 10 + 10*i); // top g.drawLine(160 - 10*i, 10 + 10*i, 160 - 10*i, 160 - 10*i); // right g.drawLine( 10 + 10*i, 160 - 10*i, 160 - 10*i, 160 - 10*i); // bottom g.drawLine( 10 + 10*i, 20 + 10*i, 10 + 10*i, 160 - 10*i); // left } } }
import java.awt.*; public class Spiral { public static void main(String[] args) { DrawingPanel panel = new DrawingPanel(170, 170); Graphics g = panel.getGraphics(); int x = 0, y = 10; int len = 160; for (int i = 0; i < 8; i++) { g.drawLine(x, y, x + len, y); // right x = x + len; len = len - 10; g.drawLine(x, y, x, y + len); // down y = y + len; g.drawLine(x, y, x - len, y); // left x = x - len; len = len - 10; g.drawLine(x, y, x, y - len); // up y = y - len; } } }
If you finish all the exercises, try out our Practice-It web tool. It lets you solve Java problems from our Building Java Programs textbook.
You can view an exercise, type a solution, and submit it to see if you have solved it correctly.
Choose some problems from the book and try to solve them!