I really don't see why it is a dirtly solution. There is quite a clear separation between the two Main and IntFrame is there not? Why do you think it is bad?
Just one thing I noticed was that you don't need winNo. You have that info from windowList.size(). The range will be limited to whatever the dataype of windowList.size() is. But again is there really a problem if the max limit is long's MAX_VALUE? That is 2^63.
Can you give a simple example of Event Listeners?