Java中的包间通信



我有一个代码,其中一半是Netbeans IDE通过选择容器和控制器生成的。在这个项目中,我有几个应该一起工作的包,能够看到彼此的变量和方法。在其中一个包中,我有一个JList项,当来自另一个包的JPanel接收到用户输入时,需要填充该项。然而,由于某些原因,这个链接是不可能的!

LMB

包 ------------------------------------------------

//This is the main class initializing the LMBView class
 public class IDAApp extends SingleFrameApplication {
     @Override
     protected void startup() {
        show(new LMBView(this));
    }
 }

 public class LMBView extends FrameView {
     public javax.swing.JList jList_PortalList;
     private void initComponents() {
          jList_PortalList = new javax.swing.JList();
              .
              .
              .
     }
LMB.resources

包 ---------------------------------------

 LMB.LMBView.jList_PortalList  // DOES NOT WORK OR LINKS TO THE CALLING OBJECT

显示错误信息

 non-static variables jList_PortalList cannot be referenced from a static context

对于LMB.LMBView.jList_PortalList,您试图通过静态调用访问非静态变量。静态调用是指引用类的名称而不是类的实例。

因此,最合理的解决方案是有一个LMBView对象的引用,并将该对象作为参数传递给您试图调用该方法的jPanel。

This:

LMB.LMBView.jList_PortalList

试图访问该变量,就好像它是静态的,而它实际上是一个实例变量。您只能为特定的实例访问它,例如

LMB.LMBView view = ...;
JList list = view.jList_PortalList;

这与包无关——你需要理解静态成员和实例成员之间的区别。听起来这个不应该是一个静态变量,你应该确保需要访问视图的代码有对LMBView相关实例的引用。

作为一个单独的问题,公共变量通常是一个非常糟糕的主意——字段是实现细节;你应该根据构造函数和方法来决定你的类的API。

为了访问非静态属性,您需要LMBView对象的引用。另一方面,您可以将属性声明为静态(但这不是最佳实践)

public static javax.swing.JList jList_PortalList;

如果你想通过引用访问属性,你必须做如下的事情:

// In the main class
public static void main (String args []) {
    LMBView lmb = new  LMBView();
    //Code for show th JFrame
    AnotherClass aclass = new AnotherClass();
    aclass.setLMBView(lmb);
    // Other code
}

在你的AnotherClass中(可以在任何包中):

public class AnotherClass {
    LMBView lmb;
    public void setLMBView(LMBView lmb) {
        this.lmb = lmb;
    }
    //Now for get the value in some method
    public void doStuff() {
        lmb.jList_PortalList.getWherever(); // Replace getWherever with a valid method
    }
}

相关内容

  • 没有找到相关文章

最新更新