Chat Transcript, 97-06-15

=> [David] joins at Sun Jun 15 19:55:22 1997 from

=> [Don] joins at Sun Jun 15 19:55:41 1997 from

David=> Hey Don
Don=> Whats up dave
David=> company just left, house is a mess
Don=> just got home, otherpeoples house is a mess
David=> works better that way!

=> [Rob] joins at Sun Jun 15 19:58:52 1997 from

David=> I have 7:59
Rob=> Hi everyone.
David=> Hello
Don=> let's get this show on the road
Rob=> I'm with you.
Rob=> How are you guys doing so far (coursewise)?
David=> OK, still need to invest more time.
Rob=> It does take a lot of time....
Rob=> and it's pretty strange compared with non-oop.

=> [wachsmut] joins at Sun Jun 15 20:02:07 1997 from

David=> yes
wachsmut=> Hi everybody ....
Don=> ahh, finally
wachsmut=> sorry I'm late ....
wachsmut=> First thing:
wachsmut=> happy father's day, for those who are ....

=> [Jenn] joins at Sun Jun 15 20:02:41 1997 from

Don=> thanks, you too
David=> thank youditto
wachsmut=> and, no game 7 today !
Don=> yaeh, your team got lucky
wachsmut=> well ... I did get my degree in the midwest,
wachsmut=> so I felt obliged to vote for the Bulls ...
wachsmut=> lucky me !
wachsmut=> Anyway, I hope you enjoyed the 'breather' ...
wachsmut=> no new lecture until yesterday, hope you're 'caught up'....
wachsmut=> I only have one question right now ....
wachsmut=> then we'll - try to - do something new ....
David=> no comment
wachsmut=> -:)
wachsmut=> So ..... this time, I ask you first:
wachsmut=> any questions ?
Rob=> I have a couple.... anybody else first?
wachsmut=> That's no surprise ...
wachsmut=> go ahead, maybe people will be less intimidated later ...
David=> go for it
Rob=> ok.. here goes: In our MoveBox example, what drew the outside rectangle?
Rob=> that is, the box the moving rectangle was in.
wachsmut=> you mean the outside rectangle that shows up in the lecture notes ?

=> [David] leaves at Sun Jun 15 20:07:03 1997

Rob=> Hmmm, I think I just mean the box the buttons and the rectangel were in....

=> [aisha] joins at Sun Jun 15 20:07:19 1997 from

wachsmut=> I see, we can do that ....
wachsmut=> any drawing, and I mean *any drawing*, must be done by ...
wachsmut=> well, by which method ?
Rob=> paint
wachsmut=> (that's a 'public String question()')
wachsmut=> yes, exactly !
wachsmut=> So, if you simply put, in any applet, a paint method,

=> [David] joins at Sun Jun 15 20:08:22 1997 from

wachsmut=> or better, override the paint method, with a call like this:
wachsmut=> public void paint(Graphics g)
wachsmut=> {
wachsmut=> g.drawRect(0,0, size().width-1, size().height-1);
wachsmut=> }
wachsmut=> then you'll get a 'border' around the entire applet.
wachsmut=> Probably that's what you're referring to, I hope ....
Rob=> ok. that's why I asked... this is what you did in the DrawingCanvas example.
wachsmut=> Yes ... but actually, in the DrawingCanvas example,
wachsmut=> the box is not around the drawing area AND the buttons,
Rob=> right.
wachsmut=> it is only around the drawing area - which is, in some sense,
wachsmut=> the point of using a canvas .....
wachsmut=> (that was my only question for today, I'll come back to that later)
wachsmut=> Any more questions ?
aisha=> no
Rob=> the default for action is super.action... what does super.action return?
Rob=> False?
wachsmut=> well, it depends ....
wachsmut=> return super.action(e, o)
wachsmut=> means that my action method will give the superclass
wachsmut=> a chance to handle the action event. If it does handle it,
wachsmut=> it will return true. But ...
wachsmut=> perhaps it, too, includes a call to super.action(e, o), in
wachsmut=> which case it passes the action event up one more time.
wachsmut=> An action method should return
wachsmut=> 'true' if it really handles the event, otherwise it
wachsmut=> should give the 'next' action method a chance to handle it.
wachsmut=> Matter of fact, that did cause lots of confusion
wachsmut=> in general, and that's exactly what
wachsmut=> was changed in Java 1.1 .... the event handling mechanism
wachsmut=> was improved a lot ... because people were pretty confused.
wachsmut=> For now, as a rule of thumb:
wachsmut=> - you handle the action even, you should return 'true'.
wachsmut=> - you don't handle it, you should give another action method a chance ....
wachsmut=> so much for that (from me).
wachsmut=> Anything else ?
aisha=> nope
David=> no
wachsmut=> (you are allowed to say no ....)
wachsmut=> Alright, then ....
wachsmut=> here's my question:
wachsmut=> what's a canvas, and what's it good for ?
wachsmut=> (while you're thinking, we have all five registered class members here !)
Rob=> It's a space on which to paint (no joke intended).
wachsmut=> (that's great, thanks for coming today !!!)
wachsmut=> Yes, exactly, that's what it is !
wachsmut=> but ....
wachsmut=> you can always paint by simply overriding the 'paint' method,
wachsmut=> so why is a Canvas necessary ?
wachsmut=> well ... when you 'paint' in a, say, Frame, then your drawings
Rob=> It provides a specific object within the application in which the drawing ...
Rob=> takes place....
wachsmut=> yes .... exactly, thanks, Rob.
Rob=> Or should I say applet?
wachsmut=> Anything ...
wachsmut=> a 'Canvas' can reside in anything (Frame, applet, etc)....
wachsmut=> If you simply override a 'paint' method inside a Frame, then
wachsmut=> your paintings will go 'everywhere', regardless
wachsmut=> of the GUI buttons, or anything else, that's already there.
wachsmut=> That means that often part of your drawing will be
wachsmut=> 'underneath' something else, hence it will not work right
wachsmut=> So ...
wachsmut=> if you paint inside a Canvas only, then you can
wachsmut=> use a layout manager to arrange that canvas together with
wachsmut=> the rest of your GUI componets, and then the
wachsmut=> drawing will only take place inside that canvas !
wachsmut=> Let's take a look at an example ....
wachsmut=> First, as usual, you must be using
wachsmut=> Windows 95 + Netscape .... I hope you do !
David=> ok
wachsmut=> I will be showing you an 'applet', that has two links at the bottom
wachsmut=> for some source code. Wait until the applet has loaded, then
wachsmut=> click on each of the source code links, and save the two files.
wachsmut=> to your disk.
wachsmut=> I mean the two source code files.
wachsmut=> Are you ready ?
wachsmut=> Please say 'yes' ...
Don=> yes
Rob=> yes
David=> yes
Jenn=> yes
wachsmut=> Aisha (I know, probably not using Win95 ...., oh well)
wachsmut=> Alright, here we go. Take 5 minutes to look things over,
wachsmut=> and save the source code ....
Rob=> Bert... I'm back... got these already from the lecture notes.
wachsmut=> please ... then, say 'aye' when you're back, please.
Rob=> probably....

=> [aisha] leaves at Sun Jun 15 20:25:42 1997

=> [Don] leaves at Sun Jun 15 20:25:50 1997

=> UNEXPECTED ERROR: client not found in list.

=> [Don13] joins at Sun Jun 15 20:26:01 1997 from

=> [aisha] joins at Sun Jun 15 20:26:21 1997 from

Jenn=> i'm back..
Don13=> me too but as a different name

=> [wachsmut] leaves at Sun Jun 15 20:26:53 1997

=> UNEXPECTED ERROR: client not found in list.

=> [wachsmut7] joins at Sun Jun 15 20:26:58 1997 from

aisha=> i'm still here
wachsmut7=> Alright, everybody back, then....
wachsmut7=> Now, in that code (same as in the lecture) there's an applet and

=> [Rob] leaves at Sun Jun 15 20:27:31 1997

=> UNEXPECTED ERROR: client not found in list.

wachsmut7=> a canvas class. The applet class simply arranges

=> [Rob1] joins at Sun Jun 15 20:27:38 1997 from

Rob1=> hello.. back
wachsmut7=> all components on the screen, including the 'Canvas'.
wachsmut7=> the 'Canvas' class is responsible for drawing.
wachsmut7=> Since it is a Canvas, it can draw where ever it wants to, and
wachsmut7=> it won't disturb anything else.
wachsmut7=> Alright .... let's keep that in the back of our head for now.
wachsmut7=> We will now try to change that applet you've just seen,
wachsmut7=> so that the box will move 'by itself' ....
wachsmut7=> We may not finish, but we'll start ....
wachsmut7=> Alright ....
wachsmut7=> what we want to discuss, briefly, is 'threads'.
wachsmut7=> A thread is another piece of code that can execute
wachsmut7=> independently and at the same time with the rest of your code.
wachsmut7=> One program can have many threads (no limit) that all
wachsmut7=> work simultaneously, but they can also
wachsmut7=> be synchronized, if necessary.
wachsmut7=> How does it work ?
wachsmut7=> For a program to use a thread, several things are
wachsmut7=> necessary:
wachsmut7=> 1. your applet (or frame, or anything else) must
wachsmut7=> 'implement Runnable' after the 'extends whatever'.
wachsmut7=> 2. You usually have a field of type 'Thread'
wachsmut7=> 3. You must implement a method called 'run'
wachsmut7=> 4. You should implement two methods called 'start' and 'stop'
wachsmut7=> that's all.....
wachsmut7=> here's an example .......
wachsmut7=> again, get ready for an applet, together with a link for source
wachsmut7=> code. Take 5 minutes to carefully look at the source code,
wachsmut7=> and especially try to identify the step 1 - 4 mentioned above.
wachsmut7=> Are you ready ?
David=> yes
Rob1=> yes
Jenn=> yes
Don13=> yes
aisha=> y
wachsmut7=> Alright, here we go. See you back here in 5 minutes from now....

=> [Don13] leaves at Sun Jun 15 20:34:11 1997

=> [aisha] leaves at Sun Jun 15 20:35:01 1997

=> [Don13] joins at Sun Jun 15 20:37:30 1997 from

David=> lk;lk
David=> back
wachsmut7=> lk; lk ?????
Don13=> back
wachsmut7=> Alright, every body back ?
Rob1=> yes

=> [aisha] joins at Sun Jun 15 20:38:13 1997 from

Jenn=> i'm back..
wachsmut7=> Jenn and Alisha ?
wachsmut7=> Sorry ... meant to say: aisha ?
aisha=> i'm here
wachsmut7=> Great....
wachsmut7=> So, I hope you saw something that simply counts up,
wachsmut7=> until infinity.
wachsmut7=> Here's how it works, briefly:
wachsmut7=> the class extends Applet, so it's an applet ....
wachsmut7=> when it's loaded, the 'init' method executes .... and adds
wachsmut7=> the textfield to the layout area.
wachsmut7=> Then it calls 'start'.
wachsmut7=> Since the field 'thread' is initially 'null', the 'start' method
wachsmut7=> will instantiate a new thread, with input "this", and then call
wachsmut7=> the 'thread's start' method.
wachsmut7=> When the thread's start method is called, it will automatically (!)
wachsmut7=> execute the applet's 'run' method
wachsmut7=> and that method is an infinite loop:
wachsmut7=> it increase the counter,
wachsmut7=> updates the textfield
wachsmut7=> and puts the thread to sleep for 400 milliseconds
wachsmut7=> inside some funny 'try-catch' phrase.
wachsmut7=> Since the loop inside the 'run' method is
wachsmut7=> an infinite loop, it looks as if your program will count, and count,
wachsmut7=> and count, and count, ....
wachsmut7=> but ....
wachsmut7=> what do you simply have to do to stop counting ?
wachsmut7=> Any clues ????
David=> lleave applet?
wachsmut7=> I.e. how can you interrupt the seamingly infinite loop in the 'run' method !
wachsmut7=> YES !
wachsmut7=> Actually, what do you mean, 'leave applet', and 'why'
David=> go to another url? which will stop execution
wachsmut7=> yes, and why will it stop execution ?
David=> ?
wachsmut7=> Well ... anyone ?
Rob1=> Leaving executes stop.
wachsmut7=> Right !
Don13=> wasn't there a method that happened when you leave and enter a page
wachsmut7=> Since the applet has a 'stop' method, that method will automatically
wachsmut7=> execute when you leave the page ....
wachsmut7=> Alright, great question, Don13 ....
wachsmut7=> what will happen when you revisit the page ?
wachsmut7=> and, of course, why ?
Don13=> the applet will start agaion?
wachsmut7=> Yes, because it implements the 'start' method !
wachsmut7=> Both, the 'start' and the 'stop' methods are cooked up so that

=> [aisha] leaves at Sun Jun 15 20:46:52 1997

Don13=> does it sart from 0 or pick up where it left off?
wachsmut7=> I love it ... well ???? Take a guess !!!!
Don13=> probably from 0 right??
wachsmut7=> Take another guess ....

=> [aisha] joins at Sun Jun 15 20:47:21 1997 from

Don13=> pick up where it left off
Rob1=> Nothing re-initializes it.
wachsmut7=> look at the start method : does that method 'reset' the 'count' ?
wachsmut7=> As Rob said, it does not.
Rob1=> What does it mean thread != null?
wachsmut7=> It simply checks if the variable 'thread' is set to null.
wachsmut7=> 'null' is a special keyword, that refers to a 'well-defined' nothing-ness.
Rob1=> Sort of how I feel on monday mornings.
wachsmut7=> In the field declaration, 'thread = null' is declared.
Rob1=> Got it... and stop resets it to null.
wachsmut7=> then in start, thread is not null, because it get's instantiated.
wachsmut7=> Then, if you leave the page, the stop method sets 'thread = null'.
wachsmut7=> The start method will then, again, start the thread.
wachsmut7=> What would you have to do to 'reset' to zero after you leave and
wachsmut7=> re-enter the page ?
wachsmut7=> it's one line, added exactly where ?
David=> in the sip method?
David=> stop method
wachsmut7=> yes, that woud work.
wachsmut7=> Or, perhaps better, in the 'start' method.
wachsmut7=> Alright, that's the basic framework for using *one* thread:
David=> count + 0
David=> = 0
wachsmut7=> - declare a field 'thread' of type Thread, set it to null.
wachsmut7=> - define a 'start' method, exactly as the one you've seen
wachsmut7=> - define a 'stop' method, exactly as the one you've seen
wachsmut7=> - implement a run method ....
wachsmut7=> the run method *should* include a call to 'thread.sleep(###)', but
wachsmut7=> the rest of the run method is different for different tasks.
wachsmut7=> Actually, the 'thread.sleep(###)' is always embedded inside a
wachsmut7=> 'try-catch' block, just as you've seen.
wachsmut7=> So .... wanna change our 'Moving Box' to include a thread ?
wachsmut7=> I'll show you the applet, then ....
wachsmut7=> I'll quickly discuss the steps necessary to change the first source
wachsmut7=> code into that, and then - back to happy father's day !
wachsmut7=> Alright, ready to see the final applet of the day ?
David=> yes
Rob1=> fire when ready
Jenn=> yes
aisha=> y
Don13=> sure
wachsmut7=> Alright, here we go ... be back soon, and say 'thanks' ... -:)

=> [Don13] leaves at Sun Jun 15 20:55:33 1997

=> [aisha] leaves at Sun Jun 15 20:55:39 1997

David=> back
wachsmut7=> woah, that's quick ....
Jenn=> bback
wachsmut7=> Alright .... hang on just a little longer !
wachsmut7=> David, Jenn back, how about the rest ?
Rob1=> back
wachsmut7=> Alrihgt .... two more ...
wachsmut7=> Well, here's the steps necessary to accomplish that:
wachsmut7=> First, the original code is the one we've seen, and saved, at the
wachsmut7=> beginning of our 'chat' ... two classes, one applet, one 'canvas' ....

=> [Don13] joins at Sun Jun 15 20:58:21 1997 from

David=> yes
wachsmut7=> which one will get the 'thread' ????? (That's the 'key question') !

=> [aisha] joins at Sun Jun 15 20:58:42 1997 from

David=> applet
wachsmut7=> Remember, the applet handles the events, while
wachsmut7=> the 'canvas' handles the drawing....
wachsmut7=> so, what does or thread do ?
wachsmut7=> Does it have to do with events, or does it have to do with
wachsmut7=> drawing ?
David=> drawing
wachsmut7=> Well ... the threa
wachsmut7=> Exactly !
wachsmut7=> (sorry) ...
wachsmut7=> so, here's today's wrap-up ....
wachsmut7=> Take the 'DrawingCanvas' class from earlier, and do the following:
wachsmut7=> - add a field 'thread', set it to null, of type 'Thread'
wachsmut7=> - add 'implement Runnable' to the 'extends Canvas'
wachsmut7=> - add the 'standard' 'start' and 'stop' methods, as seen before
wachsmut7=> dealing with thread (called 'standard thread control)
wachsmut7=> - add a 'run' method including a thread.sleep(100) call inside
wachsmut7=> a 'try-catch' block', just as before, nothing new.
wachsmut7=> - here's the new stuff:
wachsmut7=> add a field 'String direction = "left" to the canvas class
wachsmut7=> add if statements to the 'run' method like this:
wachsmut7=> if (direction.equals("left"))
wachsmut7=> boolean dummy = handleLeft();
wachsmut7=> else if (direction.equals("right"))
wachsmut7=> boolean dummy = handleRight();
wachsmut7=> etc.
wachsmut7=> Finally, add one more method to the 'canvas' class:
wachsmut7=> public boolean changeDirection(String _direction)
wachsmut7=> {
wachsmut7=> direction = _direction;
wachsmut7=> return true;
wachsmut7=> }
wachsmut7=> Save and compile.
wachsmut7=> Change the applet, but only two changes:
wachsmut7=> - in the ation method, change 'handleLeft()' to
wachsmut7=> changeDirection("left");
wachsmut7=> etc.
wachsmut7=> add 'drawing.start()' to the 'init()' method.
wachsmut7=> That's it !
wachsmut7=> I'll post the solution on Tuesday, but
wachsmut7=> I hope you'll experiment before that !
wachsmut7=> Sorry I went overtime, class over -
wachsmut7=> I'll be hanging around for questions ....
wachsmut7=> if you have any !
wachsmut7=> Thanks A LOT for all showing up on a great day as today !
Rob1=> thank to YOU too.
Don13=> thanks, 'ill look this over again and post any questions to
wachsmut7=> P.S.: In case you didnt' catch it, I'll post the transcript in 30 minutes !
Don13=> the discussion board
Don13=> bye!
wachsmut7=> Bye - love quesitons !

=> [Don13] leaves at Sun Jun 15 21:06:30 1997

Rob1=> bye
David=> good night

=> [Don] leaves at Sun Jun 15 21:06:47 1997

=> [Rob1] leaves at Sun Jun 15 21:06:49 1997

=> [Rob1] joins at Sun Jun 15 21:06:53 1997 from

=> [Rob1] leaves at Sun Jun 15 21:06:55 1997

wachsmut7=> night !

=> [Rob] leaves at Sun Jun 15 21:07:06 1997

=> UNEXPECTED ERROR: client not found in list.

Jenn=> actually i have a question about the jdk...
wachsmut7=> yes ?

=> [Rob1] joins at Sun Jun 15 21:07:19 1997 from

Jenn=> well i finally got my computer to work.. and i installed it and the pfe..
wachsmut7=> GREAT !
Jenn=> and i saved the files for my protfolio and compitled the program..
wachsmut7=> so far so good ...

=> [Rob1] leaves at Sun Jun 15 21:07:57 1997

Jenn=> but i keep getting 2 errors when i compile the test file

=> [Rob1] joins at Sun Jun 15 21:08:08 1997 from

=> [David] leaves at Sun Jun 15 21:08:13 1997

aisha=> bye - great class :] - good night
wachsmut7=> Night, Aisha !
wachsmut7=> (thanks)

=> [Rob1] leaves at Sun Jun 15 21:08:29 1997

Jenn=> i mean the file with the main method...

=> [aisha] leaves at Sun Jun 15 21:08:36 1997

wachsmut7=> what are those errors, Jenn ?
Jenn=> and i think i'm typing it in right..
Jenn=> class Task not found in type declaration
wachsmut7=> Well, can you mail me the file ? I can take a look then ?
Jenn=> Task toDo = new Task();
wachsmut7=> If you mail me right away, I'll look at it and have an answer 30 minutes
wachsmut7=> after I get it .....
wachsmut7=> it's hard to discuss specifics such as that in 'chat' ....
Jenn=> but i compiled them in pico and they both compiled..
wachsmut7=> Hmmm ....
wachsmut7=> sounds strange......
wachsmut7=> perhaps you forgot another file ? Something like '' and
Jenn=> because i think the only way i can mail it to you is through my sciris account.. and i don't want to write over the files in there..
wachsmut7=> '', both in the same directory ?
wachsmut7=> No - you have Netscape, so you can email !
Jenn=> i have as the program file
wachsmut7=> That is, send email, perhaps not receive it.
Jenn=> and for the main file
wachsmut7=> Yes, that' right .... it sems ... and both in the same directory, I anm
wachsmut7=> sure.
wachsmut7=> Wanna know how to send email with Netscape ?
Jenn=> i think i need information from the service that i dialed into for the netscape mail to work..
Jenn=> and my brother won't give it to me...
wachsmut7=> Not at all ....
wachsmut7=> it's easy, no info needed !
wachsmut7=> wanna know ?
Jenn=> oh... ok. let me try it..
Jenn=> sure..
wachsmut7=> Alright, here's the steps:
wachsmut7=> first, click on 'options', then pick 'mail and news' ....
wachsmut7=> make sure you find 'servers' or something like that, and you
Jenn=> oh yeah.. i downloaded netscape 4 and it's great!
wachsmut7=> Even better ... here's exactly what to do, then:
wachsmut7=> click on 'Edit', the 'Preferences'.....
Jenn=> uh huh...
wachsmut7=> then on 'Mail' and 'Groups'
wachsmut7=> (make sure you click on the little 'plus' sign')
wachsmut7=> click on Identity, fill in your name and email address at SHU
wachsmut7=> click on Mail server, and under SMTP server, fill in ''
wachsmut7=> That's it.
wachsmut7=> Leave incoming mail server (pop3) blank....
wachsmut7=> Then click on File, then 'new', then 'message', and send your message
wachsmut7=> to '' - simply 'cut-and-paste' your source code,
wachsmut7=> or attach via the attach button.
wachsmut7=> Got it ?
Jenn=> got it!
Jenn=> thanx.. =)
wachsmut7=> Alright .... I'll be waiting ... if that does not work,
wachsmut7=> simply 'post' your code to the discussion area (perhaps that's
wachsmut7=> the better way, and easier, anyhow (using cut-and-paste)
Jenn=> oh yeah one more thing..
wachsmut7=> yes ?
Jenn=> for me to put my program onto my homepage..
Jenn=> do i have to copy it to the sciris account?
wachsmut7=> yes, using the 'FTP' program you can download from our
wachsmut7=> homepage.
wachsmut7=> I'll post some details, it's a good point (I forgot to do that
Jenn=> ok..
wachsmut7=> so far, thanks for bringing it up )
wachsmut7=> I'll have that done tomorrow, not tonight, though .... -:)
Jenn=> great... thanks for all your help!
wachsmut7=> Alright, then, waiting for your email ! And no problem !
wachsmut7=> Bye .
Jenn=> bye

=> [wachsmut7] leaves at Sun Jun 15 21:20:21 1997

=> [Jenn] leaves at Sun Jun 15 21:20:23 1997