在不创建类的情况下设置java awt鼠标事件?
问题描述:
我正在做awt工作,但awt与JavaFX相比并不容易,我之前学习过,我在为框架中的按钮设置事件而挣扎,并且我有PlayAgain()方法,我的目标是调用方法当按钮被点击时。额外:请不要创建一个内部类来实现一些处理程序,并且使用awt而不是swing/Fx。在不创建类的情况下设置java awt鼠标事件?
这是我的代码:
public class CircleDraw extends Frame{
int[] diceResults;
public void paint(Graphics g) {
super.paint(g);
//in this part, I just using Graphics drawing some circles.
}
public void PlayAgain() {
//......do something
}
public static void main(String args[]) {
Frame frame = new CircleDraw();
Button button = new Button("again!");//this is the button, I want to set a Event, when clicking the button,my program will call PlayAgain() method
frame.add(button);
button.setBounds(5, 5, 5, 5);
frame.add(button);
frame.setLayout(new FlowLayout());
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
frame.setSize(500, 250);
frame.setVisible(true);
}
}
我记得在JavaFX中它确实可以这样写:
button.setMouseClicked(e -> {
//call the method} )
那么,有没有在AWT类似的事情可以做这个?
答
创建一个类没有办法。这是Java强大的输入所必需的。但是,您确实有一些选择,您可能会比其他人找到更好的选择。
- 您可以直接创建lambda函数。
- 您可以拥有兼容的方法签名并将其用作lambda函数。
- 您可以在您的*类中实现侦听器,即。 CircleDraw实现WindowListener。
- 您可以在CircleDraw中声明一个字段并使其成为匿名类的实例。
- 你可以使用一个匿名类作为参数(按照你的例子)
- 你可以使用一个命名的内部类(你说你不喜欢那个)。
所有这些都只是语法糖。在幕后,总是有一个实现WindowAdapter的类。
“请不要创建一个内部类” - 是_your_要求吗?请注意,即使'e - > {/ *调用方法* /}'也会创建一个匿名内部类。对于动作侦听器,您可以使用lambda表达式,例如'button.addActionListener(e - > {...})',用于像鼠标侦听器这样的其他侦听器,因为界面不符合要求(您可以提供尽管接受lambdas的某种形式的构建器)。 – Thomas
使用'Action',例如[(https://*.com/a/37063037/230513);另请参阅[*初始线程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod