2017-10-18 179 views
0

我正在做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类似的事情可以做这个?

+1

“请不要创建一个内部类” - 是_your_要求吗?请注意,即使'e - > {/ *调用方法* /}'也会创建一个匿名内部类。对于动作侦听器,您可以使用lambda表达式,例如'button.addActionListener(e - > {...})',用于像鼠标侦听器这样的其他侦听器,因为界面不符合要求(您可以提供尽管接受lambdas的某种形式的构建器)。 – Thomas

+0

使用'Action',例如[(https://stackoverflow.com/a/37063037/230513);另请参阅[*初始线程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod

回答

0

创建一个类没有办法。这是Java强大的输入所必需的。但是,您确实有一些选择,您可能会比其他人找到更好的选择。

  • 您可以直接创建lambda函数。
  • 您可以拥有兼容的方法签名并将其用作lambda函数。
  • 您可以在您的顶级类中实现侦听器,即。 CircleDraw实现WindowListener。
  • 您可以在CircleDraw中声明一个字段并使其成为匿名类的实例。
  • 你可以使用一个匿名类作为参数(按照你的例子)
  • 你可以使用一个命名的内部类(你说你不喜欢那个)。

所有这些都只是语法糖。在幕后,总是有一个实现WindowAdapter的类。

相关问题