2010-06-19 14 views
1

Je voudrais avoir un champ de texte dont la valeur reflète toujours celle d'un certain champ dans un objet donné. Je pensais que Bindable pourrait être le moyen de le faire. Cependant, en utilisant l'exemple suivant:Groovy Bindable valeur par défaut?

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

modifié à partir de:

http://groovy.codehaus.org/Bindable+and+Vetoable+transformation

seul le texte de l'étiquette est définie sur celle de textModel, mais pas celle de la textField.

Des idées ???

Merci Misha

P.S. Il me semble être en mesure d'obtenir le comportement opposé, où l'TextField reflète que l'état de la variable, mais sa valeur est pas mise à jour, si je fais:

#!/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. Si je COMBINEZ:

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

textModel haricot, texte: bind {} TextField.text texte étiquette: bind {} textModel.text }}

textModel.text="AAAA" 

je reçois

Exception dans le fil "AWT-EventQueue-0" java.lang.IllegalStateException: tentative de muter dans la notification

ppp s. Ceci est ma meilleure solution:

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

textModel haricot, texte: bind {} TextField.text texte étiquette: bind {} textModel.text }}

Répondre

0

Le Griffon guide on binding, décrit la propriété comme mutual être ce que tu veux. Même si vous n'utilisez pas Griffon dans ce cas, bind semble être une fonctionnalité Groovy standard. Si vous créez textField comme ceci:

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

textField aura sa valeur initiale de textModel.text, écrire mises à jour lorsque les types d'utilisateur dans le champ, et afficher la valeur actualisée lorsque des changements à textModel.text se produisent (à partir du fil de fond , dire). Lorsque j'ai essayé de lier deux entrées de texte comme ça, j'ai commencé à obtenir les IllegalStateExceptions que vous avez décrites, mais il semble qu'une entrée et plusieurs étiquettes sont bien.