如何使用swing builder查看和绑定数组

时间:2017-03-03 01:42:07

标签: swing groovy

目前,这会在屏幕上显示2个变量。每当该变量发生变化时,它也会显示在GUI上。

我想以类似的方式绑定数组索引。例如:x [1], 每当x [1]改变时,GUI上显示的值也会改变

编辑:数组x没有更新,我也不想要整个数组,但每个索引都在一个新行上。

import groovy.swing.SwingBuilder
import groovy.beans.Bindable

@Bindable
class controller{
    boolean stop = false;
    String status = "RUNNING";
    String name = "";
    String[] x= new String[5];
}
def ctrl = new controller();
def UI = new SwingBuilder().edt {
    frame(title: 'Menu', size: [220, 150], locationRelativeTo: null, show: true, alwaysOnTop: true){
        gridLayout(cols:1, rows: 5)
        label(text: bind(source: ctrl, sourceProperty: 'status', converter: { v ->  v? "Status: $v": ''}))
            label(text: bind(source: ctrl, sourceProperty: 'name', converter: { v ->  v? "$v": ''}))
            label(text: bind(source: ctrl, sourceProperty: 'x', converter: { v ->  v? "$v": ''}))
  }
}
for(i = 0; i < 5 ; i++){
    sleep(500);
    ctrl.name+= "Hi there ";    
    ctrl.x[i] = "T"+i;
}
ctrl.status = "DONE";
sleep(1000);
UI.dispose();

1 个答案:

答案 0 :(得分:0)

您无法以这种方式使用@Bindable观察阵列上的更改。 AST转换可以方便地注册依赖PropertyChangePropertyChangeListener的方法。

namestatus属性所做的更改有效,因为您正在替换其值,因此每次更改都会触发PropertyChangeEvent。但是对于x属性,您不是更改数组引用,而是更改数组中的元素。

您有两种方法可以完成这项工作:

  1. 要么观察索引本身的变化(将一个Integer属性添加到controller类)。
  2. 使用ObservableList代替数组。
  3. 我个人更喜欢选项#1。您将不得不使用转换器,如

    label(text: bind(source: ctrl, sourceProperty: 'index', converter: { v ->  v != -1? ctrl.x[v]: ''}))
    

    请注意,使用-1检查所选索引的值为0会导致上一次检查(v?)由于Groovy Truth而失败。

    controller类可以更新如下

    @Bindable
    class controller{
        boolean stop = false;
        String status = "RUNNING";
        String name = "";
        String[] x= new String[5];
        int index = -1;
    }