我想在canvas
内使用mousePressed
。我怎么能这样做?
public DragManager(Canvas canvas)
{
canvas.addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e)
{
canvas.something(); // does not work.
}
});
}
答案 0 :(得分:2)
使参数最终:
public DragManager(final Canvas canvas)
答案 1 :(得分:2)
正如这里的许多人已经说过你必须让函数参数最终。
public DragManager(final Canvas canvas)
{
canvas.addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e)
{
canvas.something();
}
});
}
这意味着此变量不能指向任何其他对象。例如。你不能在函数内做到这一点:
canvas = SomeOtherCanvas
如果使用本地类定义创建对象,则在从堆栈中放弃局部变量之后(在DragManager
构造函数完成之后),该对象可以保持“生存”。它必须有本地值的副本。如果你将这个参数设为final(所以它保证构造函数中的引用不会指向其他地方),那么复制很容易:只需复制一个引用。如果没有这样的规则你(好吧,不是你个人,但Java语言)需要不断地同步这些值,这将是更复杂和缓慢的解决方案。
答案 2 :(得分:1)
你不能在定义的内部类中引用非final变量。将你的画布标记为最终。
public void DragManager(final Canvas canvas)
{
canvas.addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e)
{
System.out.println(canvas);;// does not work.
}
});
答案 3 :(得分:0)
public DragManager(final Canvas canvas)
{
canvas.addMouseListener(new MouseAdapter() {
@Override public void mousePressed(MouseEvent e)
{
canvas.something(); // does work.
}
});
}
因为您可以修改canvas变量,所以应该将其定义为final(常量引用)。
答案 4 :(得分:0)
不使用最终关键字。您可以添加返回此的 Init 方法并添加私有变量。 通过Call Init方法传递canvas。
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));
}