Reputation: 67
I'm trying to make an app where I have 3 classes. A Controlller (Main Class), SerialHandler and MainWindow which is a JFrame Form created with the NetBeans Gui Builder.
public class Controller {
SerialHandler serialHandler;
MainWindow mainWindow;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Controller controller = new Controller();
controller.initializeSystem(controller);
}
public void initializeSystem(Controller _controller){
mainWindow = new MainWindow(_controller);
mainWindow.setVisible(true);
}
public void anotherMethod(){
mainWindow.setMyLabelText("Hello");
}
}
So the problem is that if I doit like that and an event from the SerialHandler class calls anotherMethod(), the setMyLabelText method doesn't work but if I called it from the initializeSystem(); it works.
Now if I declare the mainwindow inside the main then the mainWindow instance is not visible from the anotherMethod().
If I declare the mainWindow object outside the main and try to use its method from main context I can't because the mainWindow object have been declared outside the non-static context.
Could anyone help me or at least point me in the right direction?
Thanks!
Upvotes: 1
Views: 1424
Reputation: 21419
There is a design inconsistency with your code:
public static void main(String[] args) {
// TODO code application logic here
Controller controller = new Controller();
controller.initializeSystem(controller);
}
public void initializeSystem(){
mainWindow = new MainWindow(_controller);
mainWindow.setVisible(true);
}
You are creating the controller that you are passing as an argument to its initializeSystem
which is superfluous as you could just use this
inside initializeSystem
.
You should do this instead:
public static void main(String[] args) {
// TODO code application logic here
Controller controller = new Controller();
controller.initializeSystem();
}
public void initializeSystem(Controller _controller){
mainWindow = new MainWindow(this);
mainWindow.setVisible(true);
}
The second inconsistency is the method anotherMethod
which accesses your UI and updates stuff in it. You should leave that to the controller instead. Something like this:
public class Controller {
//...
public void updateUIText(String text){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
mainWindow.setMyLabelText("Hello");
}
});
}
}
Now, the SerialHandler
can update the UI via the Controller when it needs to. All what you have to do is to pass in the Controller
reference to the SerialHandler
EDIT Note that I used the SwingUtilities.invokeLater
to update the UI, this will ensure the Controller
will correctly update the UI even in multithreaded scenarios which I assume is your case
Upvotes: 2