I've created a few GUI applications in Java before, and every time I'm really just messing around until the thing does what I want it to do, using snippits from several GUI examples I find on the web. Recently I read some more about good practices when writing a GUI in Java using Swing, but still some things are unclear to me. Let me first describe what I want to do in my next project so that we can use that as an example:
I'd like to create an executable application that gives a user the ability to load images, perform some actions on these images and save the project. There should be a main image viewer at the core with a simple navigator below it to switch between the loaded images. There should be panels with buttons that perform operations on an image (for example a button 'pick background color from image') and these operations should optionally be accessible from a toolbar or a menu.
I know that for example the GUI should be started from the Event Dispatch Thread and that I can use a SwingWorker for timeconsuming operations. Also I learned that by using Actions I can separate functionality from state and create one Action for both a panel button, a toolbar button and a menu item.
What I don't understand is how all these things communicate with each other, and where I put what. For example: do I maintain the state of my program (so which image is currently displayed, what settings are set) in a separate model and put a reference to this model in my main window class? And what about the controllers? Do I keep a reference to the models in the controllers are well? And when I did some calculation on an image, do I update the image in the gui from the controller, or from the gui itself using a simple repaint?
I guess the main problem I have is that I don't really understand how to let the different parts of my program communicate. A GUI consists of lots of parts, and then there are all these Actions and Listeners, models, controllers, and all of these need to interact somehow. I keep adding references to almost everything in all of these objects, but it makes everything extremely messy.
Another example I found on the web: http://www.devdaily.com/java/java-action-abstractaction-actionlistener
I understand how this works, what I don't understand is how to actually change the "Would have done the 'Cut' action." into the actual cut action. Let's say it involves cutting a part out of my image in the viewer, would I have passed the image to the action? And if this process would take long, would I have created a new SwingWorker inside the action? And then how would I let the SwingWorker update the GUI while calculating? Would I pass a reference of the GUI to the SwingWorker such that it can update it from time to time?
Does anyone have a good example on how to do this or maybe some tips on how to correctly learn this, because I'm at a bit of a loss. There's just so much information and so many different ways to do things, and I really want to learn how to create scalable applications with clean code. Is there maybe a good open-source project with not too much code that very nicely demonstrates a GUI like what I described so that I can learn from that?
I've built a few Swing and SWT GUI's. What I've found is that a GUI requires its own model - view (MV) structure. The application controller interacts with the GUI model, rather than the GUI components.
Basically, I build a Java bean for every Swing JPanel in my GUI. The GUI components interact with the Java bean, and the application controller interacts with the Java bean(s).
Here's a Spirograph GUI that I created.
Here's the Java bean that manages the Spirograph parameters.
Edited to add the Control Panel class.