调用Java接口函数:还有其他可能的方法吗?
我想让一个JPanel响应MouseEvent,比如mousePressed(),但不响应其他。 我可以通过添加到JPanel对象中的以下代码来实现这一点:调用Java接口函数:还有其他可能的方法吗?,java,swing,event-handling,awt,Java,Swing,Event Handling,Awt,我想让一个JPanel响应MouseEvent,比如mousePressed(),但不响应其他。 我可以通过添加到JPanel对象中的以下代码来实现这一点: addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { //Some action here } }); 但是,匿名函数要求我在其中使用final变量。我的程序规范不允许我这么做
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent me) {
//Some action here
}
});
但是,匿名函数要求我在其中使用final变量。我的程序规范不允许我这么做
我还可以将MouseEvents定义为外部类,而不是内部类,但是我必须为MouseListener接口中的所有函数提供实现,例如mouseClicked()、mouseenterned()、mouseExited()等
有没有其他方法可以实现我要做的事情,即定义mousePressed()函数,而不必在其中使用最终变量,也不必在接口中定义其他函数
非常感谢
编辑:我意识到我提供的代码运行正常,因为内部类正在创建一个抽象类MouseAdapter的对象
然而,我的问题仍然存在:如果我不想定义抽象类的所有方法,也不必使用内部类,有没有办法做到这一点?下面是一个例子:
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);
}
}
此外,您还可以使用官方教程。“定义mousePressed()函数而不必在其内部使用最终变量”-使用实例字段而不是局部变量只需说
类MyListener扩展了“外部”类中的MouseAdapter,你只需要实现一个你想要覆盖的函数,阅读我上面的评论。内部阶级不是魔法;上面的代码只定义了一个扩展MouseAdapter的未命名(匿名)类。您还可以从命名类扩展MouseAdapter,并具有与MouseAdapter已经实现抽象方法相同的行为。您“不允许”使用的最终变量具体是什么?@ErwinBolwidt,如果我这样做,我不需要为MouseAdapter中的其他方法(抽象类)提供定义吗?我不希望我的类是抽象的。+1,但是内部类MouseAdapter()仍然只允许修改最终变量。@chrylis提供的解决方案非常简洁。感谢您的评论!