2011-07-01 1 views
-1

私のコードは次のとおりです。私はsublassからスーパークラスで定義された文字列にアクセスしようとしているNULL値を取得しています

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

私は、クラスData_storerに表示されている値がnullである場合、文字列uを印刷しています... ...助けを借りてください....事前に感謝! – kosmicbug

+0

質問を質問に入れて、コメントではなく、より良い形式にしてください..または..あなたが編集できるかどうかわかりませんが、誰かがこれを編集してください。 – Lacrymology

+0

** bold **クラスRegister_windowに文字列uを出力すると、入力された文字列が正確に表示されますが、Data_storerクラスに表示すると、値はnullになります!! – kosmicbug

答えて

2

あなたはUを初期化する必要があります。 people_databaseの前にjButton1ActionPerformedが呼び出されていると仮定しています。

+0

問題は本当に継承の悪用です。 Data_storerは、Register_windowの「is-a」基準を真に満たしていません。言い換えれば、これは本当にRegister_windowの動物ではなく、Register_windowを継承しているため、 'u'変数へのアクセスが可能ですが、dlevが指摘しているように、2つのuは完全に区別されるため、必ず失敗します。 –

1

uに実際に何かを割り当ててもよろしいですか? jbutton1を決してクリックしないと(したがってjButton1ActionPerformedは呼び出されません)、uは実際にnullになります。

+0

jbutton1ActionPerformedは呼び出されません。実際には、ユーザーの希望するログイン名を文字列uに設定する「アカウントの作成」ボタンです。この後、Data_storerクラスからデータを取得するFriend_Databaseクラスが呼び出されます。文字列uのnull値、Friend_databaseクラスからユーザーの希望するログイン名にアクセスできません。 – kosmicbug

+0

親クラスのインスタンス(ボタンをクリックした場所)と子クラスの別のインスタンスがありますか? – dlev

+0

はい私は値を割り当てています...他にどのようにそれがクラスの文字列を表示するのですかRegister_window – kosmicbug

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に変更を加えた場合、それらの両方が別個FIELDA年代を運ぶために、それはオブジェクトbに影響を与えません。

class C { 
    private A a; 

    C(A a) { 
     this.a = a; 
    } 

    public String getAFieldA() { 
     return a.getFieldA(); 
    } 
} 

その後にこれを解決する方法は、Aを拡張するが、現在のオブジェクトへの参照を使用するように、クラスCのように2番目のクラスを作成し、必要に応じてオブジェクトから必要な情報を抽出しないことですメインあなたが行うことができます:あなたのコードに変換

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()); 
     // ... 

    } 
} 

もう1つの考えられる解決策は、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) { 

     //... 
    } 
} 
関連する問題