目前,这会在屏幕上显示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();
答案 0 :(得分:0)
您无法以这种方式使用@Bindable
观察阵列上的更改。 AST转换可以方便地注册依赖PropertyChange
和PropertyChangeListener
的方法。
对name
和status
属性所做的更改有效,因为您正在替换其值,因此每次更改都会触发PropertyChangeEvent
。但是对于x
属性,您不是更改数组引用,而是更改数组中的元素。
您有两种方法可以完成这项工作:
controller
类)。ObservableList
代替数组。我个人更喜欢选项#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;
}