【问题标题】:Netbeans GUI and non-static methodNetbeans GUI 和非静态方法
【发布时间】:2012-07-05 19:52:59
【问题描述】:

我正在尝试制作一个包含 3 个课程的应用程序。控制器(主类)、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 中声明 mainwindow,那么 mainWindow 实例在 anotherMethod() 中是不可见的。

如果我在 main 之外声明 mainWindow 对象并尝试从 main 上下文中使用它的方法,我不能,因为 mainWindow 对象已在非静态上下文之外声明。

谁能帮助我或至少为我指明正确的方向?

谢谢!

【问题讨论】:

  • 您需要将引用传递给需要使用它们的对象。这可以通过构造函数参数或setXXX(...)“setter”方法来完成。
  • 你的代码不会编译 public anotherMethod() { is invalid java syntax
  • 问题是如何将 mainWindow 对象传递给我创建的类?我的方法在 Controller 类中,但我在这个类中创建了我的 mainWindow ......那我该怎么办?

标签: java user-interface netbeans non-static


【解决方案1】:

与您的代码存在设计不一致:

   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 的控制器,这是多余的,因为您可以在initializeSystem 中使用this

你应该这样做:

   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 更新 UI,这将确保 Controller 即使在我假设是您的情况的多线程场景中也能正确更新 UI

【讨论】:

  • 现在这就是我所说的帮助。我不习惯 run() 但我会试试看:)。谢谢。对此的任何其他想法将不胜感激。
  • @Twistx77 很高兴为您提供帮助 :) run() 方法从也称为 EDT 的 UI 线程更新您的 UI。
猜你喜欢
  • 1970-01-01
  • 2020-12-27
  • 2016-08-07
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
相关资源
最近更新 更多