One more thing ...

The only thing on the agenda for this class is to review one more aspect of object oriented programming. It goes back to our earlier lessons, where the moral of our story was that we wanted the code operating on the fields of an object of class Foo to be a method of class Foo. That idea meant that, when designing a class, we put the focus not on what data should be in the class, but what methods it should have. This is a lesson we all need to learn over an over again. I wanted to provide yet another example of that idea, but this time in the context of GUI programming.

Disobeying the law

The code below produces the world's simplest (and perhaps worst) GUI program: a primitive conversion program, as pictured here:

The version of the program given directly below violates the principle of information hiding. All the fields are public!
Convert.java ConListener.java
ConWin.java

Obeying the letter, but not the spirit

For many students, the way to rewrite the above code in the proper Object Oriented way is clear: make the fields private, but add getters and setters for each field, as shown below. Perhaps this follows the letter of the law, but definitely not the spirit. All you've really accomplished is to make a "struct" with a lot of extra code around it. In fact, other than extra code, the structure of the program hasn't changed at all!
Convert.java ConListener.java
ConWin.java

Obeying the spirit ... and acheiving enlightenment

Why is the above getter/setter solution not really following the spirit of OOP? Because the getter/setter operations are not natural operations for Convert objects. They're just workarounds, so that you can't be accused of having public fields and violating information hiding. Encapsulation still hasn't been addressed satisfactorily, though. The real point is that the code for updating the Convert panel shouldn't be in ConvListener. It's an operation that manipulates a Convert panel, so it should be a part of Convert.

The solution below gets rid of the getters and setters and adds an "update" method to the Convert class, which tells the convert panel to update itself. That's a proper object oriented solution to this problem.

Convert.java ConListener.java
ConWin.java