Search code examples
javamultithreadingswingjlabel

Best way to handle JFrame components from outside class


I was developing a swing application which calls multiple methods & initializes different classes. Also I have multiple threads in which they process intermediate results. My requirement is to display that intermediate data on some labels and text boxes on the fly.

Please help me which of the below approach is best in terms of memory and performance.

  1. I can have setter methods for all my labels and text boxes. So that I can call these methods using that swing class object but in that case I need to pass the swing class object to every class wherever I want to set the data to labels.
  2. Another way is I can create public static object of my swing class and I would call it from any class whenever I need to set the label text.

First method creates more overhead as I need to pass the my Swing class object to other classes.

Second method is easiest way but creating static objects might create confusion as this application contains threads.

I just want to know which one to go for and why?

Otherwise if anybody have worked on some complex swing app development - how did you manage these kind of issues?


Solution

  • This example is typical of your first approach in a multi-threaded context. For expedience, the model and view are tightly coupled: each worker thread receives a reference to the label it should update. The alternative is loose coupling: each view registers to listen to the model, which notifies all registered listeners using the observer pattern.

    This simpler example uses both approaches:

    • Tight coupling: The worker obtains a reference to its target label in an enclosing scope.

    • Loose coupling: The enclosing view registers a PropertyChangeListener, which the model uses to signal the view via setProgress().

    You'll need to decide which is important in your application. I agree with @JB Nizet's comment about the second approach.