package test2;
public class NewJFrame extends javax.swing.JFrame {
private static void valueGen() {
String x = jTextField1.getText();
System.out.println(x);
}
public NewJFrame() {
initComponents();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
jTextField1.setText("Hello");
}
public static void main(String args[]) {
valueGen();
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
private javax.swing.JButton jButton1;
private javax.swing.JTextField jTextField1;
}
我有一个如上所示的程序。
我需要从函数valueGen()中访问 jTextField1 的值。
但是我得到了错误:
non-static variable cannot be referenced from static context
如何从valueGen()访问jTextField1的值?
答案 0 :(得分:1)
嗯,这取决于你需要什么。
如果你的整个程序中只有一个jTextField1
(我怀疑是这样的话),只需将其设为静态:
private static javax.swing.JTextField jTextField1;
但是,如果您更有可能拥有多个NewJFrame
个对象,那么请在代码中添加一个getter方法:
public javax.swing.JTextField getTextField() {
return this.jTextField1;
}
然后将其作为参数添加到valueGen
:
private static void valueGen(javax.swing.JTextField jTextField1) {
String x = jTextField1.getText();
System.out.println(x);
}
现在,当您致电valueGen
时,只需使用getter方法:
NewJFrame myFrame = NewJFrame();
//some code
valueGen(myFrame.getTextField());
这样你仍然可以使用static
方法来处理任何对象实例'文本字段。
答案 1 :(得分:0)
从您的问题看来,您似乎并不知道静态限定符的作用是什么,因此我专注于解释这一点。
定义类并添加非静态成员变量时,您将定义该类的每个实例的外观。因此,例如,如果您定义
class A {
public int x;
}
和你做的某个地方:
A a1 = new A ();
A a2 = new A ();
a1.x = 1;
a2.x = 2;
System.out.println (a1.x+", "+a2.x);
输出为1, 2
。这是因为a1和a2指向两个独立的对象,每个对象都有自己的x。
但是,当您将变量声明为static时,该类的所有实例都会共享此变量的单个实例。实际上,变量被认为属于类本身,而不是实例。可以在没有任何对象实例的情况下引用静态变量,只使用类的名称(A.x)。
类似于一个类如何拥有自己的变量,它可以有自己的方法(静态方法)。可以使用类名(A.m1()
)调用静态方法。该方法可以引用静态变量,但不能引用非静态变量。原因是类可能有多个实例,每个实例都有不同的变量值,那么应该使用哪一个?
因此,从静态方法可以引用静态变量,而从非静态方法可以引用静态和非静态变量。在您的示例中,您有一个静态方法试图访问非静态变量,这是不允许的。我怀疑在你的情况下你将有一个Jframe子类的单个实例,在这种情况下你可以使方法静态或使变量非静态并获得相同的结果,但在一般情况下,最好尽可能避免静态变量。