【问题标题】:Groovy Bindable default value?Groovy 可绑定默认值?
【发布时间】:2010-06-19 00:04:21
【问题描述】:

我想要一个文本字段,其值始终反映给定对象中某个字段的值。我认为 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的。

有什么想法吗???

谢谢 米莎

附言我似乎能够得到相反的行为,其中 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: 绑定{ textField.text } 标签文本:绑定{ 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: 绑定{ textField.text } 标签文本:绑定{ textModel.text } } }

【问题讨论】:

    标签: groovy bindable swingbuilder


    【解决方案1】:

    Griffon guide on bindingmutual 属性描述为您想要的。即使在这种情况下您没有使用 Griffon,bind 似乎也是标准的 Groovy 功能​​。如果你像这样创建textField

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

    textField 将从textModel.text 获取其初始值,当用户在字段中输入时将更新写入它,并在textModel.text 发生更改时显示更新的值(例如,来自某个后台线程)。当我尝试像这样绑定 两个 文本输入时,我开始收到您描述的 IllegalStateExceptions,但似乎一个输入和多个标签都可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 2011-07-22
      • 2018-11-25
      • 2017-12-15
      相关资源
      最近更新 更多