valueChanged gui列表执行两次

时间:2012-06-22 19:41:17

标签: 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) {
            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上寻找了类似于这个问题的其他问题但是如果它是重复的话我没有用,我很抱歉,我会删除它,但我不相信它。我试图做的就是让它不能在鼠标上执行。

1 个答案:

答案 0 :(得分:4)

是的,使用Swing JList,当用户点击一行时,您会收到两个valueChanged事件。

第一次点击将有event.valueIsAdjusting == true表示用户正在更改值,第二个事件将event.valueIsAdjusting == false显示已做出的选择(请参阅{{3和事件evaluation section of this bug report* here

更改:

 valueChanged:{
   mess(listing.selectedValue);// this code runs twice
 }

要:

 valueChanged:{ event ->
   if( !event.valueIsAdjusting ) mess(listing.selectedValue)
 }

应该解决这个问题......

(*应该注意,这不是一个错误,因为它的闭包状态可以看出): - )


修改

要清除选择,您可以将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
            }
          }
        }
      }
    }
  }
}