我正在尝试创建一个我有3个班级的应用程序。 Controlller(主类),SerialHandler和MainWindow,它是使用NetBeans Gui Builder创建的JFrame表单。
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");
}
}
所以问题是如果我这样做并且来自SerialHandler类的事件调用anotherMethod(),则setMyLabelText方法不起作用,但是如果我从initializeSystem()调用它;它有效。
现在,如果我在main中声明主窗口,那么从AnotherMethod()中看不到mainWindow实例。
如果我在main之外声明mainWindow对象并尝试在main上下文中使用它的方法,我不能,因为mainWindow对象已在非静态上下文之外声明。
有人可以帮助我,或者至少指出我正确的方向吗?
谢谢!
答案 0 :(得分:2)
您的代码与设计不一致:
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);
}
您正在创建作为参数传递给其initializeSystem
的控制器,这是多余的,因为您可以在this
内使用initializeSystem
。
你应该这样做:
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);
}
第二个不一致是方法anotherMethod
,它访问您的UI并更新其中的内容。你应该把它留给控制器。像这样:
public class Controller {
//...
public void updateUIText(String text){
SwingUtilities.invokeLater(new Runnable() {
public void run() {
mainWindow.setMyLabelText("Hello");
}
});
}
}
现在,SerialHandler
可以在需要时通过Controller更新UI。您所要做的就是将Controller
引用传递给SerialHandler
编辑请注意,我使用SwingUtilities.invokeLater
来更新用户界面,这样可以确保Controller
即使在多线程场景下也能正确更新用户界面,我认为这是您的情况