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

正如这里的许多人已经说过的那样,您必须将函数参数设为最终值。

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

这意味着这个变量不能指向任何其他对象。例如,您不能在函数内部执行此操作:

canvas = SomeOtherCanvas

如果您使用本地类定义创建对象,则在从堆栈中丢弃局部变量后(在DragManager构造函数完成后),该对象可以继续“存活”。它必须具有本地值的副本。如果您将此参数设置为最终参数(因此可以保证构造函数内的引用不会指向其他地方),那么拥有一个副本真的很容易:只需复制一个引用。如果没有这样的规则,您(嗯,不是您个人,而是 Java 语言)将需要不断地同步这些值,这将是一个更加复杂和缓慢的解决方案。

于 2012-12-07T21:51:40.940 回答
2

使参数最终:

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.
        }
    });
}

由于您可以修改画布变量,因此您应该将其定义为最终(常量引用)。

于 2012-12-07T21:44:09.403 回答
0

不使用final关键字。您可以添加返回this的Init方法并添加私有变量。通过 Call Init 方法传递画布。

public DragManager(Canvas canvas)
{
    canvas.addMouseListener(new MouseAdapter() {
        Canvas _canvas;
        @Override public void mousePressed(MouseEvent e)
        {
            _canvas.something(); // does not work.
        }
        public MouseAdapter Init(Canvas canvas){
            _canvas = canvas;
            return this;
        }
    }.Init(canvas));
}
于 2016-11-24T17:49:11.703 回答