我应该将JTextField UserDisp的文本设置为从登录表单中检索到的用户名,但会显示错误。变量用户的值来自输入登录表单的用户名。
错误显示:'无法从静态上下文'
引用非静态变量UserDisp代码如下:
public static void main(final String user) {
//look and feel codes are omitted
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
String name = "Welcome "+user+"!";
UserDisp.setText(name);
new MainMenu().setVisible(true);
}
});
}
答案 0 :(得分:1)
在将类加载到JVM
时初始化的静态变量另一方面,实例变量对每个实例具有不同的值,并且在使用new()
运算符或使用Class.newInstance()
运算符创建对象的实例时创建它们反射像MainNenu
。
因此,如果您尝试访问非静态变量而没有任何实例编译器会抱怨,因为这些变量尚未创建,并且在创建实例并且它们与任何实例关联之前它们不存在。所以在我看来,只有在静态上下文中禁止非静态或实例变量才有意义的理由是不存在实例。
因此,在您的情况下,您需要创建 MainMenu menu = new MainMenu();
menu.setUserDispNameText(name);
menu.setVisible(true);
对象,然后设置用户名文本,然后显示菜单。
例如:
{{1}}
了解更多here
答案 1 :(得分:0)
这里的问题是main方法是静态的,一个好的解决方法是创建一个实现Runnable
的类并让它的构造函数接受登录信息作为参数,
在run方法中,使用获取的值来设置文本。
public class MyRunnable implements Runnable {
private String user;
public MyRunnable(final String user) {
this.user = user;
}
@Override
public void run() {
// now use the user variable to set the text.
}
}
主要方法中的说
java.awt.EventQueue.invokeLater(new MyRunnable(user));