无法从静态上下文引用非静态变量jTextField1

时间:2015-06-07 05:28:14

标签: java static jframe

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的值?

2 个答案:

答案 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子类的单个实例,在这种情况下你可以使方法静态或使变量非静态并获得相同的结果,但在一般情况下,最好尽可能避免静态变量。