Groovy可绑定默认值?

Groovy可绑定默认值?,groovy,bindable,swingbuilder,Groovy,Bindable,Swingbuilder,我希望有一个文本字段,其值始终反映给定对象中某个字段的值。我认为Bindable可能是实现这一点的方法。但是,使用以下示例: #!/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 tex

我希望有一个文本字段,其值始终反映给定对象中某个字段的值。我认为Bindable可能是实现这一点的方法。但是,使用以下示例:

#!/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"
修改自:

只有标签文本设置为textModel的文本,而不是textField的文本

有什么想法吗

多谢各位 米沙

p、 我似乎可以得到相反的行为,其中TextField反映变量的状态,但其值不会更新,如果我这样做:

#!/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、 注:如果我同时添加以下两项:

#!/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 }
bean textModel,text:bind{textField.text} 标签文本:绑定{textModel.text} } }

我明白了

线程“AWT-EventQueue-0”java.lang.IllegalStateException中出现异常:尝试在通知中发生变异

p、 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()
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
bean textModel,text:bind{textField.text} 标签文本:绑定{textModel.text} } }将
mutual
属性描述为您想要的属性。即使在本例中没有使用Griffon,
bind
似乎是Groovy的标准特性。如果您这样创建
textField

  textField id: 'textField', text: bind('text', source: textModel, mutual: true)
textField
将从
textModel.text
获取其初始值,当用户在字段中键入时写入更新,并在发生
textModel.text
更改时显示更新的值(例如,从某个后台线程)。当我尝试像这样绑定两个文本输入时,我开始得到您描述的非法状态异常,但似乎一个输入和多个标签都可以

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