65.9K
CodeProject 正在变化。 阅读更多。
Home

Beans 绑定(人性化)

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2011 年 4 月 21 日

CPOL

2分钟阅读

viewsIcon

18566

展示了如何将 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 的属性是否已更改。

链接

历史

  • 2011 年 4 月 21 日:初始发布
© . All rights reserved.