Netbeans GUI和非静态方法

时间:2012-07-05 19:52:59

标签: java user-interface netbeans non-static

我正在尝试创建一个我有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对象已在非静态上下文之外声明。

有人可以帮助我,或者至少指出我正确的方向吗?

谢谢!

1 个答案:

答案 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即使在多线程场景下也能正确更新用户界面,我认为这是您的情况