【问题标题】:Calling Java Interface functions : any other way possible?调用 Java 接口函数:还有其他可能的方式吗?
【发布时间】:2017-11-25 02:27:09
【问题描述】:

我想让 JPanel 响应 MouseEvent,例如 mousePressed(),但不响应其他事件。 我可以通过添加到 JPanel 对象的以下代码来做到这一点:

addMouseListener(new MouseAdapter() { 
      public void mousePressed(MouseEvent me) { 
        //Some action here
      } 
    }); 

但是,匿名函数要求我在其中使用最终变量。而且我的程序规范不允许我这样做。

我也可以不将 MouseEvents 定义为内部类,而是外部类,但是我必须为 MouseListener 接口中的所有函数提供实现,例如 mouseClicked()、mouseEntered()、mouseExited() 等。

有没有其他方法可以实现我想要做的事情,即定义 mousePressed() 函数而不必在其中使用最终变量,也不必在接口中定义其他函数?

非常感谢!

编辑:我意识到我提供的代码运行没有错误,因为内部类正在创建一个 MouseAdapter 对象,它是一个抽象类。

但是,我的问题仍然存在:如果我不想定义抽象类的所有方法,也不必使用内部类,有什么办法吗?

【问题讨论】:

  • "定义 mousePressed() 函数,而不必在其中使用最终变量" - 使用实例字段而不是局部变量
  • 只要在你的“外部”类中说class MyListener extends MouseAdapter,你只需要实现你想要重写的那个函数。
  • 阅读我上面的评论。内部类不是魔法;您上面的代码只是定义了一个扩展 MouseAdapter 的未命名(匿名)类。您还可以从命名类扩展 MouseAdapter,并在 MouseAdapter 已经实现抽象方法的情况下具有相同的行为。
  • 您“不允许”使用最终变量的具体内容是什么?
  • @ErwinBolwidt,如果我这样做,我是否不必为作为抽象类的 MouseAdapter 中的其他方法提供定义?我不希望我的课程是抽象的。

标签: java swing event-handling awt


【解决方案1】:

其中一个例子:

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainClass extends JPanel {

  public MainClass() {

      addMouseListener(new MouseAdapter() { 
          public void mousePressed(MouseEvent me) { 
            System.out.println(me); 
          } 
        }); 

  }

  public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.getContentPane().add(new MainClass());

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    frame.setSize(200, 200);
    frame.setVisible(true);
  }
}

也可以使用官方教程here

【讨论】:

  • +1,但内部类 MouseAdapter() 仍然只允许修改最终变量。 @chrylis 提供的解决方案非常简洁。
  • 感谢您的评论!
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2023-02-20
相关资源
最近更新 更多