4

この単純なGUIリストで選択を行うと、valueChangedが取得され、マウスを下にしたときに1回、マウスを上にしたときに1回実行されます。

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を使用すると、ユーザーが行をクリックすると2つのvalueChangedイベントが発生します。

最初のクリックevent.valueIsAdjusting == trueは、ユーザーが値を変更していることを示す必要があり、2番目のイベントは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 に答える