Swing valueChanged gui列表执行两次
当在这个简单的gui列表上进行选择时,我会将valueChanged执行两次,鼠标按下时执行一次,鼠标上升时执行一次Swing valueChanged gui列表执行两次,swing,user-interface,groovy,selection,Swing,User Interface,Groovy,Selection,当在这个简单的gui列表上进行选择时,我会将valueChanged执行两次,鼠标按下时执行一次,鼠标上升时执行一次 import groovy.swing.SwingBuilder import java.awt.* import java.swing.* import javax.swing.* def main(){ new SwingBuilder().edt { frame(title:'Testing', pack:true, show:true) {
import groovy.swing.SwingBuilder
import java.awt.*
import java.swing.*
import javax.swing.*
def main(){
new SwingBuilder().edt {
frame(title:'Testing', pack:true, show:true) {
vbox {
panel(){
textbox = label(text:'null')
}
panel(){
listing = list(valueChanged:{
mess(listing.selectedValue);// this code runs twice
},
listData: ['test','another','test','and','again'])
}
}
}
}
}
def mess(mytext){
new SwingBuilder().edt {
frame(title:'Message', pack:true, show:true){
vbox {
panel(){
label(text:mytext)
}
}
}
}
}
main();
我已经在stackoverflow上寻找了其他类似的问题,如果它是重复的,我很抱歉,我会删除它,但我不相信它是重复的。我所要做的就是让它不要在鼠标向上时执行。是的,使用Swing JList,当用户单击一行时,您会看到两个valueChanged事件
import groovy.swing.SwingBuilder
import java.awt.*
import java.swing.*
import javax.swing.*
def main(){
new SwingBuilder().edt {
frame(title:'Testing', pack:true, show:true) {
vbox {
panel(){
textbox = label(text:'null')
}
panel(){
listing = list(valueChanged:{
mess(listing.selectedValue);// this code runs twice
},
listData: ['test','another','test','and','again'])
}
}
}
}
}
def mess(mytext){
new SwingBuilder().edt {
frame(title:'Message', pack:true, show:true){
vbox {
panel(){
label(text:mytext)
}
}
}
}
}
main();
第一次单击将显示event.valueIsAdjusting==true
以指示用户正在更改值,第二次单击将显示event.valueIsAdjusting==false
以显示已进行选择(请参阅和事件)
更改:
valueChanged:{
mess(listing.selectedValue);// this code runs twice
}
致:
应该解决这个问题
(*应该注意,这不是一个bug,从它的关闭状态可以看出):-)
编辑 要清除选择,可以将
main()
更改为:
def main() {
def data = ['test','another','test','and','again']
def codeFired = false
new SwingBuilder().edt {
frame(title:'Testing', pack:true, show:true) {
vbox {
panel(){
textbox = label(text:'null')
}
panel(){
listing = list listData: data, valueChanged: { event ->
if( !event.valueIsAdjusting && !codeFired ) {
mess( listing.selectedValue )
codeFired = true
listing.clearSelection()
codeFired = false
}
}
}
}
}
}
}
我知道这不是一个bug,但我不知道如何应对。我的下一个问题是,我仍然希望用户能够单击并获取信息,但它不必保持选中状态。在事件执行后,我如何取消选择它?我相信您需要将某种标志变量设置为true(表示您正在以编程方式设置值,然后设置所选索引,然后将标志设置回false。然后检查事件处理程序中的标志,如果设置了,则不要执行任何操作(否则,如果我没记错,您将得到无限循环)…这有什么意义吗?现在不是在电脑上…它工作得很好,非常感谢。虽然我尝试了不使用codeFired,但它不是无限循环,但它确实上下同时启动…所以还是谢谢:]