1

canvas中で使いたいmousePressed。どうやってやるの?

public DragManager(Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        @Override public void mousePressed(MouseEvent e)
        {
            canvas.something(); // does not work.
        }
    });
}
4

5 に答える 5

3

ここにいる人の多くが、関数パラメーターを final にする必要があると既に言っています。

public DragManager(final Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        @Override public void mousePressed(MouseEvent e)
        {
            canvas.something();
        }
    });
}

つまり、この変数は他のオブジェクトを指すことができません。たとえば、関数内でこれを行うことはできません。

canvas = SomeOtherCanvas

ローカル クラス定義を使用してオブジェクトを作成する場合、そのオブジェクトは、ローカル変数がスタックから破棄された後 (DragManagerコンストラクターの完了後) に「存続」し続けることができます。ローカル値のコピーが必要です。このパラメーターを final にすると (コンストラクター内の参照が他の場所を指していないことが保証されます)、コピーを作成するのは非常に簡単になります。参照をコピーするだけです。そのようなルールがなければ、あなた (個人的にではなく、Java 言語) はこれらの値を常に同期する必要があり、それははるかに複雑で遅い解決策になります。

于 2012-12-07T21:51:40.940 に答える
2

パラメータを final にします。

public DragManager(final Canvas canvas)
于 2012-12-07T21:44:11.707 に答える
1

定義された内部クラス内で非最終変数を参照することはできません。キャンバスを最終としてマークします。

public void DragManager(final Canvas canvas)
    {

        canvas.addMouseListener(new MouseAdapter() {
            @Override public void mousePressed(MouseEvent e)
            {
                System.out.println(canvas);;// does not work.
            }
        });
于 2012-12-07T21:45:22.690 に答える
0
public DragManager(final Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        @Override public void mousePressed(MouseEvent e)
        {
            canvas.something(); // does work.
        }
    });
}

キャンバス変数は変更できるので、final(定数参照)として定義する必要があります。

于 2012-12-07T21:44:09.403 に答える