我有一个代码,其中一半是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
}
}