Re: Odd behaviour or normal?
Rhino wrote:
I have a class called TextInputPanel which subclasses JPanel. My subclass
has a JLabel and a JTextField on it. My class has been working fine but
today I added some trivial-seeming functionality and suddenly I got odd
behaviour. All I did was to override the setForeground() and setBackground()
methods of the parent class, just to control the specific colors of the
foreground and background of the JTextField.
Why in the world would you change the 'JPanel' colors if all you want is to
change the colors of the 'JTextField'? That seems whacked.
Much to my surprise, I started getting NullPointerExceptions and soon
determined that my overridden setForeground() and setBackground() methods
were executing BEFORE the JTextField was instantiated. I couldn't set the
color on the JTextField because they JTextField didn't exist yet. In fact, a
println() statement right after the super() in my constructor soon revealed
that the overridden methods were executing even before the println() was
printed.
Is that normal behaviour? In other words, are overridden methods on the
parent class SUPPOSED to execute even before the instantiation of the child
class? It's been so long since I did GUI work that I really don't remember
what should or shouldn't happen.
If an overridable method is called within a superclass constructor, the
overridden method in the subclass will execute prior to the subclass's
constructor. That is normal and expected and the reason why they shouldn't
have put calls to an overridable method in the superclass constructor.
Think!
You called 'super()' before 'println()', didn't you? So whatever 'super()'
calls must happen before the 'println()', too, right?
If this is working the way it is supposed to, I can live with that. I just
renamed the overridden methods so that they didn't match the names of
methods in the parent class and that solves my immediate problem. But if
That's not a solution unless you shouldn't have overridden the methods in the
first place.
Which may be the case.
Which raises the question why you thought you needed to override the methods
in the first place.
it's NOT working the way it is supposed to, I want to know that to so that I
can figure out what dumb thing I did to get that behaviour.
You extended 'JPanel'. Why? Usually you don't, you compose (have as a class
member) 'JPanel'.
You extend when you need a version of 'JPanel' that has unique behaviors, but
that almost certainly is not the case here.
So I ask this question again in hopes that you will actually answer,
thoughtfully with reasons and logic explained, what was the design reasoning
behind extending 'JPanel'?
--
Lew