Groovy Bindable значение по умолчанию? - PullRequest
1 голос
/ 19 июня 2010

Я хотел бы иметь текстовое поле, значение которого всегда отражает значение определенного поля в данном объекте.Я думал, что 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.

Любые идеи ???

Спасибо, Миша

ps Кажется, я могу получить противоположное поведение, когда 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"

pps Если я добавлю оба:

#!/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.текст} текст метки: bind {textModel.text}}}

textModel.text="AAAA"

Я получаю

Исключение в потоке "AWT-EventQueue-0" java.lang.IllegalStateException: попытка изменить вУведомление

ppps Это мое лучшее решение:

#!/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 голосов
/ 28 января 2011

Руководство Griffon по связыванию описывает свойство mutual как то, что вам нужно. Даже если вы не используете Griffon в этом случае, bind кажется стандартной функцией Groovy. Если вы создаете textField, как это:

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

textField получит свое начальное значение из textModel.text, запишет в него обновления, когда пользователь введет в поле, и отобразит обновленное значение, когда произойдут изменения в textModel.text (скажем, из некоторого фонового потока). Когда я попытался связать два текстовых ввода, как это, я начал получать исключения IllegalStateExceptions, которые вы описали, но, похоже, один вход и несколько меток в порядке.

...