Groovy 实现接口

import javax.swing.*
import java.awt.*
import java.awt.event.*

//用具名参数初始化对象
//setSize(int width, int height) 是父类java.awt.Component的方法
//javax.swing.JFrame#setLayout (LayoutManager manager)
//javax.swing.JFrame#setDefaultCloseOperation(int operation)
frame = new JFrame(size: [300, 300],
  layout: new FlowLayout(),
  defaultCloseOperation: javax.swing.WindowConstants.EXIT_ON_CLOSE)

button = new JButton("click")
positionLabel = new JLabel("")
msgLabel = new JLabel("")

//javax.swing.JFrame#getContentPane 调用属性的getter
// button是一个参数
// Groovy中的方法调用可以省略括号,如果有至少一个参数,并且不存在任何含糊。在命名参数的时候,也是可以省略的
frame.contentPane.add button
frame.contentPane.add positionLabel
frame.contentPane.add msgLabel

// 借助as把代码块定位为对ActionListener接口的实现
button.addActionListener(
  { JOptionPane.showMessageDialog(frame, "You clicked!") } as ActionListener
)

// displayMouseLocation 指向一个代码块
displayMouseLocation = { positionLabel.setText("$it.x, $it.y") }

// addMouseListener(MouseListener l)的参数是接口MouseListener,
// 而接口java.awt.event.MouseListener 有5个方法,在该程序中5个方法的实现是一样的,因此借助as 都引用了displayMouseLocation 
frame.addMouseListener(displayMouseLocation as MouseListener)
frame.addMouseMotionListener(displayMouseLocation as MouseMotionListener)

//对接口中多个方法,分别不同的实现,key是方法名,代码块是实现
handleFocus = [
  focusGained : { msgLabel.setText("Good to see you!") },
  focusLost : { msgLabel.setText("Come back soon!") }
]
button.addFocusListener(handleFocus as FocusListener)

events = ['WindowListener', 'ComponentListener'] 
handler = { msgLabel.setText("$it") }
for (event in events) {
//用asType为动态接口 Class.forName("java.awt.event.${event}" 一个实现 { msgLabel.setText("$it") }
  handlerImpl = handler.asType(Class.forName("java.awt.event.${event}"))
  frame."add${event}"(handlerImpl)
}

frame.show()
frame

你可能感兴趣的:(Groovy 实现接口)