1

特定のオブジェクトの特定のフィールドの値を常に反映するテキスト フィールドが必要です。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.text } label text: bind{ textModel.text } } }

textModel.text="AAAA"

私は得る

スレッド「AWT-EventQueue-0」の例外 java.lang.IllegalStateException: Attempt to mutate in notifications

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 } label text: bind{ textModel.text } } }

4

1 に答える 1

0

バインディングに関するGriffon ガイドでは、mutualプロパティが必要なものであると説明しています。この場合、Griffon を使用していませんbindが、Groovy の標準機能のようです。このように作成する場合textField

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

textFieldから初期値を取得しtextModel.text、ユーザーがフィールドに入力したときに更新を書き込み、変更が発生したときに更新された値を表示しtextModel.textます (たとえば、バックグラウンド スレッドから)。このように2つのテキスト入力をバインドしようとすると、あなたが説明したIllegalStateExceptionsが発生し始めましたが、1つの入力と複数のラベルは問題ないようです。

于 2011-01-28T05:52:14.003 に答える