我正在使用swing来编写简单的计算方法。我在循环中声明按钮并同时向它们添加AcionListeners。我们认为听众可以为每个按钮工作,除了“=”按钮。我不知道这里有什么问题。你能帮帮我吗?
import javax.swing.*
import java.awt.*
import java.awt.event.*
frame = new JFrame(size: [600, 300], layout: new FlowLayout())
msgLabel = new JLabel("")
frame.contentPane.add msgLabel
def characters = "0123456789,/*-+=C"
0.upto(characters.length()-1) {
def sign = characters.getAt(it)
button = new JButton(sign)
frame.contentPane.add button
println this.getClass().getName()
if(sign == "=") {
button.addActionListener({ equals() } as ActionListener)
} else if(sign == "C") {
button.addActionListener({ clear() } as ActionListener)
} else {
button.addActionListener({ putText(sign) } as ActionListener)
}
}
frame.show()
public void equals() {
println "equals"
}
public void clear() {
println "clear"
}
public void putText(sign) {
println sign
}
先谢谢!!
答案 0 :(得分:1)
将“等于”方法更改为“结果”,您就完成了:
button.addActionListener({ result() } as ActionListener)
[...]
public void result() {
println "equals"
}
或使用“this”来避免您可能遇到的隐藏/范围问题:
button.addActionListener({ this.equals() } as ActionListener)
[...]
public void equals() {
println "equals"
}
现在我不确定哪个对象equals()
方法隐藏了你的方法,但我刚刚在groovy控制台(2.3.6)中测试了上述解决方案并且它们正在运行。
编辑:你可以“避免”对button.actionPerformed = closure
进行ActionListener
的封闭强制,即:
if(sign == '=') {
button.actionPerformed = { println '=' }
} else if(sign == 'C') {
button.actionPerformed = { println 'clear' }
} else {
button.actionPerformed = { println sign }
}