Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swing valueChanged gui列表执行两次_Swing_User Interface_Groovy_Selection - Fatal编程技术网

Swing valueChanged gui列表执行两次

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) {

当在这个简单的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上寻找了其他类似的问题,如果它是重复的,我很抱歉,我会删除它,但我不相信它是重复的。我所要做的就是让它不要在鼠标向上时执行。

是的,使用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,但它不是无限循环,但它确实上下同时启动…所以还是谢谢:]