groovy ActionListener在一种情况下不起作用

时间:2014-11-04 17:59:27

标签: java swing groovy

我正在使用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
}

先谢谢!!

1 个答案:

答案 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 }
}