2010-06-19 101 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,但似乎有一个输入和多个标签都没问题。