2010-06-19 80 views
1

我想有一個文本字段,其值總是反映給定對象中某個字段的值。我認爲Bindable可能是這樣做的方式。但是,使用下面的例子:從修改Groovy可綁定默認值?

#!/usr/bin/env groovy 

import groovy.swing.SwingBuilder 
import groovy.beans.Bindable 
import static javax.swing.JFrame.EXIT_ON_CLOSE 

class TextModel { 
    @Bindable String text 
} 

def textModel = new TextModel() 

def builder=new SwingBuilder() 
builder.build { 
    frame(title: 'Binding Example (Groovy)', size: [240,100], show: true, 
      locationRelativeTo: null, defaultCloseOperation: EXIT_ON_CLOSE) { 
     gridLayout cols: 1, rows: 2 
     textField id: 'textField' 
     bean textModel, text: bind{ textField.text } 
     label text: bind{ textModel.text } 
    } 
} 

textModel.text="AAAA" 

http://groovy.codehaus.org/Bindable+and+Vetoable+transformation

只有標籤的文本設置爲textModel的,但不是文本字段的。

任何想法???

謝謝 米莎

附:我似乎能夠得到相反的行爲,這裏的文本字段反映了變量是狀態,但其價值不更新,如果我這樣做:

#!/usr/bin/env groovy 

import groovy.swing.SwingBuilder 
import groovy.beans.Bindable 
import static javax.swing.JFrame.EXIT_ON_CLOSE 

class TextModel { 
    @Bindable String text 
} 

def textModel = new TextModel() 

def builder=new SwingBuilder() 
builder.build { 
    frame(title: 'Binding Example (Groovy)', size: [240,100], show: true, 
      locationRelativeTo: null, defaultCloseOperation: EXIT_ON_CLOSE) { 
     gridLayout cols: 1, rows: 2 
     textField id: 'textField',text:bind{ textModel.text } 
     label text: bind{ textModel.text } 
    } 
} 

textModel.text="AAAA" 

p.p.s.如果我想補充兩個:

#!/usr/bin/env groovy 

import groovy.swing.SwingBuilder 
import groovy.beans.Bindable 
import static javax.swing.JFrame.EXIT_ON_CLOSE 

class TextModel { 
    @Bindable String text 
} 

def textModel = new TextModel() 

def builder=new SwingBuilder() 
builder.build { 
    frame(title: 'Binding Example (Groovy)', size: [240,100], show: true, 
      locationRelativeTo: null, defaultCloseOperation: EXIT_ON_CLOSE) { 
     gridLayout cols: 1, rows: 2 

     textField id: 'textField',text:bind{ textModel.text } 

豆textModel,文本:綁定{}的TextField.text標籤 文本:綁定{} textModel.text} }

textModel.text="AAAA" 

我得到

線程「AWT-EventQueue-0」中的異常java.lang.IllegalStateException:試圖在通知中發生變異

ppp秒。這是我最好的解決辦法:

#!/usr/bin/env groovy 

import groovy.swing.SwingBuilder 
import groovy.beans.Bindable 
import static javax.swing.JFrame.EXIT_ON_CLOSE 

class TextModel { 
    @Bindable String text 
} 

def textModel = new TextModel() 
textModel.text="AAAA" 

def builder=new SwingBuilder() 
builder.build { 
    frame(title: 'Binding Example (Groovy)', size: [240,100], show: true, 
      locationRelativeTo: null, defaultCloseOperation: EXIT_ON_CLOSE) { 
     gridLayout cols: 1, rows: 2 

     textField id: 'textField',text:textModel.text 

豆textModel,文本:綁定{}的TextField.text標籤 文本:綁定{} textModel.text} }

回答

0

Griffon guide on binding,描述了mutual財產正是你想要的。儘管在這種情況下你沒有使用Griffon,bind似乎是標準的Groovy功能。如果您創建textField這樣的:

textField id: 'textField', text: bind('text', source: textModel, mutual: true) 

textField將從textModel.text獲取其初始值,寫入更新時,在該領域的用戶類型,並在發生變化時,以textModel.text(一些後臺線程顯示更新的值,說)。當我試圖綁定兩個這樣的文本輸入時,我開始得到你描述的IllegalStateException,但似乎有一個輸入和多個標籤都沒問題。