2017-10-18 67 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的類。

相關問題