Groovy Bindable默认值?

时间:2010-06-19 00:04:21

标签: 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 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的标签文本,而不是textField的标签文本。

任何想法???

谢谢 米莎

P.S。我似乎能够得到相反的行为,TextField反映变量的 state ,但是如果我这样做,它的值不会更新:

#!/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 }

bean textModel,text:bind {textField.text}             标签文本:bind {textModel.text}         }     }

textModel.text="AAAA"

我得到了

线程“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}    标签文本:bind {textModel.text}         }     }

1 个答案:

答案 0 :(得分: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更改时显示更新的值(来自某些背景)线程,说)。当我尝试绑定这样的两个文本输入时,我开始获取您描述的IllegalStateExceptions,但似乎一个输入和多个标签都没问题。

相关问题