0

Swing-GUIと外部クラスがあります。Swing GUIのコンストラクターで、外部クラスの新しいオブジェクトをインスタンス化します。しかし、GUIクラスの他のメソッド(アクションリスナー内など)からこのオブジェクトを使用することはできません。アクションリスナーでオブジェクトを直接インスタンス化すると、外部クラスのすべてのメソッドを使用できます。

関連するコードスニペットは次のとおりです。もっと必要な場合は教えてください:-)

1)私の外部クラス

public class ExternalClass
{
    private int a = 100;
    public int getA() {
        return a;
    }
}

2)私のGUIクラスの一部

パブリッククラスGUIはjavax.swing.JFrameを拡張します{

// constructor
public GUI()
{
    initComponents();
    ExternalClass e = new ExternalClass();
}
//...
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt)
{

    int u = e.getA();
// this doesn't work - the object e is not known by the method

}
//...
        java.awt.EventQueue.invokeLater(new Runnable()
    {

        public void run()
        {
            new GUI().setVisible(true);

        }
    });
4

3 に答える 3

2

オブジェクトはコンストラクターで宣言されます。したがって、コンストラクター自体の中にのみ存在します。他のメソッドで使用する場合は、クラスの属性として、たとえば次のように、外部で宣言する必要があります。

ExternalClass e;    

// constructor
public GUI()
{
    initComponents();
    e = new ExternalClass();
}

このフィールドは、GUIクラスを含むパッケージ内のすべてのクラスに表示されることに注意してください。アクセスレベル(パッケージアクセスの場合はプライベート、パブリック、またはなし)を指定することをお勧めします。

于 2012-09-21T11:33:18.743 に答える
2

コンストラクター内で変数を宣言してインスタンス化するeため、コンストラクター内でのみ表示されます。

メンバー変数として宣言すると、そこでインスタンス化するか、コンストラクターでインスタンス化できます。

于 2012-09-21T11:26:06.337 に答える
2

eオブジェクトのスコープ(スコープは変数の可視性を意味します)は、コンストラクターで述べたため、コンストラクターに限定されますExternalClass e

最も簡単な解決策は、コンストラクターで定義するだけでなく、この変数をクラスのメンバーにすることです。

の宣言をExternalClass eコンストラクターの外に移動しますが、それでもクラス自体に移動します。コンストラクターで、を実行しますe = new ExternalClass();eコンストラクターはクラス自体よりもスコープが低いため、ここではコンストラクターに表示されますjButton1ActionPerformed。同じ理由で、メソッドにも表示されます。

于 2012-09-21T11:26:50.403 に答える