我的代码是:
public class Register_window extends javax.swing.JFrame
{
String u;
.
.
.
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{
try
{
.
.
u=jTextField.getText();
.
.
}
}
}
public class Data_storer extends Register_window
{
public Vector people_database() throws Exception
{
.
.
.
System.out.println("The name of the user as printed in Data_storer(inherited from Register_window) is:" + u);
.
.
.
}
}
答案 0 :(得分:2)
你需要初始化你。您假设在jButton1ActionPerformed
之前调用people_database
。
答案 1 :(得分:1)
您确定要向u
分配任何内容吗?如果您从未单击过jbutton1(因此未调用jButton1ActionPerformed
),则u
实际上将为null
。
答案 2 :(得分:0)
你的问题与此类似:
public class FooA {
public static void main(String[] args) {
A a = new A();
a.setFieldA("bar");
B b = new B();
System.out.println(b.getFieldA()); // this will still print "foo"
}
}
class A {
String fieldA = "foo";
public void setFieldA(String a) {
this.fieldA = a;
}
public String getFieldA() {
return fieldA;
}
}
class B extends A {
}
如果对对象a中的fieldA进行了更改,则它不会影响对象b,因为它们都带有不同的fieldA。解决这个问题的方法是不扩展A,而是像C类一样构造你的第二个类,使用对当前A对象的引用,然后根据需要从A对象中提取必要的信息:
class C {
private A a;
C(A a) {
this.a = a;
}
public String getAFieldA() {
return a.getFieldA();
}
}
然后在主要部分你可以做:
public class FooA {
public static void main(String[] args) {
A a = new A();
a.setFieldA("bar");
B b = new B();
System.out.println(b.getFieldA()); // this will still print "foo"
C c = new C(a);
System.out.println(c.getAFieldA()); // this will print "bar"
}
}
转换为您的代码,它看起来像这样:
public class Register_window extends javax.swing.JFrame {
private JTextField jTextField = new JTextField();
// String u; // this is not necessary
// ...
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
// ...
// somehow notify Data_storer that a field has changed.
// ...
} finally {
}
}
public String getTextFieldText() {
return jTextField.getText();
}
}
Data_storer类:
public class Data_storer extends Register_window {
private Register_window registerWindow;
// pass the current visualized Register_window instance into constructor
public Data_storer(Register_window register_window) {
this.registerWindow = register_window;
}
public Vector people_database() throws Exception {
// ...
System.out.println("The name of the user as printed in Data_storer(inherited from Register_window) is:"
+ registerWindow.getTextFieldText());
// ...
}
}
另一种可能的解决方案是扭转局面,使GUI保存数据存储器的实例,并在按钮按下时将信息“推送”到数据存储器对象中,这实际上对我来说更有意义。例如:
public class Register_window extends javax.swing.JFrame {
private JTextField jTextField = new JTextField();
private Data_storer dataStorer = new Data_storer();
// ...
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
try {
// ...
Vector vect = dataStorer.people_database(jTextField.getText());
// do something with the vect here
}
//...
}
}
class Data_storer extends Register_window {
public Vector people_database(String text) {
//...
}
}