4

在这个简单的 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上寻找了与此类似的其他问题,但如果它是重复的,我很抱歉,我会删除它,但我不相信它是。我正在尝试做的只是让它在鼠标启动时不执行。

4

1 回答 1

4

是的,使用 Swing JList,当用户单击一行时,您会获得两个 valueChanged 事件。

第一次单击必须event.valueIsAdjusting == true表明用户正在更改值,第二次事件必须event.valueIsAdjusting == false显示已进行选择(请参阅此错误报告*的评估部分和此处的事件文档

改变:

 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
            }
          }
        }
      }
    }
  }
}
于 2012-06-22T19:59:01.977 回答