Beans 绑定(人性化)





0/5 (0投票)
展示了如何将 Beans 绑定与 SwingHTMLTemplate 结合使用
引言
在我的上一篇文章中,我展示了如何使用 HTML 标记轻松组合 Swing 表单。从那时起,我的 swinghtmltemplate
库已更新到 0.3 版本,并支持 Beans Binding。在这里,我将展示使用绑定的一些基本示例。
背景
绑定是将两个属性的值同步的过程。对于 Swing 而言,这允许,例如,将 JTextField
的 «text
» 属性与 Person
的 «name
» 属性保持同步。你可以在这里了解更多关于绑定的信息。
Using the Code
使用 Maven 添加库
<dependencies>
<dependency>
<groupId>com.googlecode.swinghtmltemplate</groupId>
<artifactId>swinghtmltemplate</artifactId>
<version>0.3</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>swinghtmltemplate</id>
<name>Swing html template repo</name>
<url>http://swinghtmltemplate.googlecode.com/svn/maven-repository</url>
<releases>
<enabled>true</enabled>
<updatePolicy>never</updatePolicy>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
你也可以下载包含依赖项的发行版。
让我们创建一个领域对象 — person
。它有两个属性:name
和 email
。
public class Person {
private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
private String name;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
Object old = this.name;
this.name = name;
pcs.firePropertyChange("name", old, name);
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
Object old = this.email;
this.email = email;
pcs.firePropertyChange("email", old, email);
}
public void addPropertyChangeListener(PropertyChangeListener listener) {
pcs.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
pcs.removePropertyChangeListener(listener);
}
}
我们想要创建一个包含 2 个输入字段的表单,并将它们绑定到 name
和 email
属性。
要指定绑定,你必须执行 2 件事
- 提供带有模型值的 dom 模型
- 为组件指定绑定
第一个任务可以通过以下方式完成
DomModel domModel = ...;
model.addModelElement("person", new Person());
现在,person
对象已传递到 dom 模型,键名为 «person
»,因此你可以使用 ${person} 来访问它。
如果你有表单的控制器,你可以使用 @ModelAttribute
注解提供模型值。
让我们为我们的表单创建一个控制器
package foo;
...//imports
public class PersonForm extends JPanel {
private DomModel model;
@ModelElement("person")
private Person person = new Person();
public PersonForm() {
try {
model = Binder.bind(this, true);
}
catch (JDOMException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public Person getPerson () {
return person;
}
public void setPerson (Person person) {
Object old = this.person ;
this.person = person;
firePropertyChange("person", old, person);
}
public void onOK() {
System.out.println(person.getName()+" "+person.getEmail());
}
public static void main(String[] args) throws JDOMException, IOException {
PersonForm personForm = new PersonForm();
Person person = new Person();
person.setName("John Doe");
personForm.setPerson(person);
JFrame f = new JFrame("Test");
f.setSize(400, 200);
f.getContentPane().add(personForm);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
你可以看到,我们将我们的领域对象传递到 dom 模型,名称为 «person
»。当调用 Binder.bind(this, true);
时,模型将被填充,因此你可以在此调用之前准备领域值。
另外请注意,我们在 setter 中触发了一个属性更改。这是标准的 Java Bean 例程。
在 main
方法中,我们创建了控制器的实例,并将其放置在 JFrame
中。我们还创建了一个具有指定名称的初始 person。
接下来,让我们创建一个表单,看看如何将其绑定到 person
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:c="http://www.oracle.com/swing">
<head>
</head>
<body style="display: border;width: 400; height:300; border: empty 12 12 12 12">
<form>
<label for="name">Name:</label>
<input id='name' type="text" value="${person.name}" align="wrap"/>
<label for="email">Email:</label>
<input id="email" type="text" value="${person.email}" align="wrap" />
<input type='button' onclick="onOK" text="OK"/>
</form>
</body>
</html>
我们将此代码放在 «/src/foo/PersonForm.html» 中。
查看 input 标签。我们在 «value
» 属性中指定绑定。第一个输入绑定到 person 的 "name" 属性,第二个绑定到 "email
" 属性。绑定是双向的,因此更改输入字段中的文本将更新 person
,而更改 person
的属性将更新文本字段。
我们向面板添加了一个按钮 — 最后一个输入。它具有 'onclick
' 属性,其值为 «onOK
»。这意味着单击按钮时将调用 «PersonForm.onOK()
»。
你可以尝试该示例,输入一些文本,按下按钮,看看 person 的属性是否已更改。
链接
- 上一篇文章:swinghtmltemplate_usage.aspx
- 项目:http://code.google.com/p/swinghtmltemplate/
- 文档:http://code.google.com/p/swinghtmltemplate/wiki/Documentation_0_3
- Beans binding:http://java.net/projects/beansbinding/
历史
- 2011 年 4 月 21 日:初始发布