gpt4 book ai didi

swing - valueChanged gui 列表执行两次

转载 作者:行者123 更新时间:2023-12-01 01:17:34 26 4
gpt4 key购买 nike

在这个简单的 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 事件。

第一次点击会有event.valueIsAdjusting == true表示用户正在修改值,第二个事件会有event.valueIsAdjusting == false显示已做出选择(参见 evaluation section of this bug report* here 和事件 documentation 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
}
}
}
}
}
}
}

关于swing - valueChanged gui 列表执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11163025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com