数据绑定JAVA Windows Builder自动绑定JLabel,并在TimerTask中更新bean
我试图用一个Bean类提供的值更新JLabel中显示的文本,该Bean类在TimerTask中更新
Bean得到了很好的更新,但JLabel没有更新
为了说明这个问题,我构建了一个小项目,包括:
- 设置并获取字符串变量的类Bean,该字符串变量将 使用我的JLabel绑定
package test;
public class Bean {
private String value;
public Bean() {
setValue("Created");
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
- 用于更新Bean中变量的TimerTask(UpdateTask) (在其值上加一个“X”)
package test;
import java.util.TimerTask;
public class UpdateTask extends TimerTask{
private Bean bean;
public UpdateTask(Bean bean) {
this.bean=bean;
}
@Override
public void run() {
System.out.println("UpdateTask - Bean = " + bean.getValue());
bean.setValue(bean.getValue() +"X");
System.out.println("UpdateTask - Bean = " + bean.getValue());
}
}
- 仅用于输出Bean值的TimerTask(ViewTask) 控制台中JLabel的变量和
package test;
import java.util.TimerTask;
import javax.swing.JLabel;
public class ViewTask extends TimerTask{
private JLabel lbl;
private Bean bean;
public ViewTask(JLabel lbl, Bean bean) {
this.lbl=lbl;
this.bean=bean;
}
@Override
public void run() {
System.out.println("ViewTask - Bean:" + bean.getValue());
System.out.println("ViewTask - Label:" + lbl.getText());
}
}
- 显示带有JLabel的框架的主类,创建Bean, 初始化数据绑定并启动我的2个计时器
package test;
import java.awt.EventQueue;
import java.util.Timer;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.BorderLayout;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy;
public class Panel {
private JFrame frame;
private Bean bean;
private JLabel lblNewLabel;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Panel window = new Panel();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Panel() {
initialize();
bean =new Bean();
new Timer().schedule(new ViewTask(lblNewLabel, bean), 0, 1000);
new Timer().schedule(new UpdateTask(bean), 0, 1000);
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 100, 100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout(0, 0));
lblNewLabel = new JLabel("New label");
frame.getContentPane().add(lblNewLabel);
initDataBindings();
}
protected void initDataBindings() {
BeanProperty<Bean, String> beanBeanProperty = BeanProperty.create("value");
BeanProperty<JLabel, String> jLabelBeanProperty = BeanProperty.create("text");
AutoBinding<Bean, String, JLabel, String> autoBinding = Bindings.createAutoBinding(UpdateStrategy.READ, bean, beanBeanProperty, lblNewLabel, jLabelBeanProperty);
autoBinding.bind();
}
}
- Windows Builder中显示的我的绑定属性:
在运行时,控制台中的输出如下所示:
ViewTask - Bean:Created
UpdateTask - Bean = Created
ViewTask - Label:New label
UpdateTask - Bean = CreatedX
UpdateTask - Bean = CreatedX
UpdateTask - Bean = CreatedXX
ViewTask - Bean:CreatedX
ViewTask - Label:New label
UpdateTask - Bean = CreatedXX
UpdateTask - Bean = CreatedXXX
ViewTask - Bean:CreatedXX
ViewTask - Label:New label
UpdateTask - Bean = CreatedXXX
UpdateTask - Bean = CreatedXXXX
ViewTask - Bean:CreatedXXX <--- Bean is updated
ViewTask - Label:New label <--- Label is not updated
有人能帮我找出问题出在哪里吗?谢谢
共 (0) 个答案