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 实现接口
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...