Well, when you said visble and invisible, you pretty much stated what you need to do.
Here is what I would do.
When one frame is open and then you pass information to the next frame then set the current frame's visibility to false setVisible(false). That way the Frame is still there, and all the variables and components won't change. Also, as part of the arguments you are passing, pass the Frame object or some reference to where the new frame was instantiated from to the next frame. Then you always have a reference to what frame you came from, and if you need to go back, just setVisible(true). Then, at some point, you will need to clean up loose ends and dispose() of whatever frames you can dispose of.
Anyway, that is a on the fly solution. There are probably better ways, and if I think of one, I will edit my response.
