Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT-如何将业务对象与小部件关联_Gwt_Widget - Fatal编程技术网

GWT-如何将业务对象与小部件关联

GWT-如何将业务对象与小部件关联,gwt,widget,Gwt,Widget,我希望有一种方法可以轻松地将小部件绑定回它正在呈现的业务对象。因此,当用户与小部件交互时,我可以轻松确定保存该小部件数据的业务对象 例如,如果我们设想一个日历小部件,我们将用AbsolutePanel实现它。对于每个appt对象,我们将在日历中添加一个标签。然后,当用户单击标签时,他可以更新应用程序。所以我需要知道标签所指的是哪个appt对象 例如,如果我们看下面的代码;如果某个约会的标签收到了单击,我如何才能找到它代表的应用程序?我能看到的唯一解决方案是为Label创建一个ApptLabel子

我希望有一种方法可以轻松地将小部件绑定回它正在呈现的业务对象。因此,当用户与小部件交互时,我可以轻松确定保存该小部件数据的业务对象

例如,如果我们设想一个日历小部件,我们将用AbsolutePanel实现它。对于每个appt对象,我们将在日历中添加一个标签。然后,当用户单击标签时,他可以更新应用程序。所以我需要知道标签所指的是哪个appt对象

例如,如果我们看下面的代码;如果某个约会的标签收到了单击,我如何才能找到它代表的应用程序?我能看到的唯一解决方案是为Label创建一个ApptLabel子类,该子类将保存对其appt的引用。这很好,但是这个例子说明了一个更普遍的需求,即将小部件与数据对象关联起来;然而,这意味着在视图中存在的每个对象都需要对小部件进行子类化。这似乎很沉重——我希望在框架中找到一些东西,例如,在小部件中可以设置为对象键的字符串属性

我尝试过的其他方法;维护map的映射——这不起作用,因为我创建的label对象看起来不一样(就object.equals而言,我猜HashMap使用的是object.equals)

类WidgetCalendar扩展了复合{ AbsolutePanel m_panel=新AbsolutePanel(); m_panel.setStylePrimaryName(“日历”); m_面板。设置像素大小(宽度、高度); 公共WidgetCalendar(ArrayList应用程序){ initWidget(m_面板); 适用于(BomAppt a:appts){ 标签l=新标签(); l、 addClickHandler(新的ClickHandler(){ 公共作废一次点击(点击事件){ //我怎么知道我在这里的老板? } 添加(l,someX,someY); } } } 理想情况下,我可以这样做 类WidgetCalendar扩展了复合{ AbsolutePanel m_panel=新AbsolutePanel(); m_panel.setStylePrimaryName(“日历”); m_面板。设置像素大小(宽度、高度)

公共WidgetCalendar(ArrayList应用程序){ initWidget(m_面板); 适用于(BomAppt a:appts){ 标签l=新标签(); l、 setItemData(a.getUniqueId()); l、 addClickHandler(新的ClickHandler(){ 公共作废一次点击(点击事件){ BomAppt a=BomAppt.getApptWithId(e.getItemData()) } } 添加(l,someX,someY); } } } 这是我创建一个子类的解决方案,这对我来说很重,我更喜欢简单的东西

class ApptLabel extends Label {
    public ApptLabel(BomAppt a) {
      m_a = a;
  this.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
      m_a.doSomething();
            });
    }

    BomAppt m_a;
}

class WidgetCalendar extends Composite { 
    AbsolutePanel m_panel = new AbsolutePanel();
    m_panel.setStylePrimaryName("calendar");
    m_panel.setPixelSize(width, height);

    public WidgetCalendar(ArrayList<BomAppt> appts) {
       initWidget(m_panel);
       for (BomAppt a : appts) {
          BomLabel l = new BomLabel();
          l.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
    // how do I know my BomAppt in here ?                   
       }

          m_panel.add(l, someX, someY);
       }
    }
}
类ApptLabel扩展标签{
公共应用标签(BomAppt a){
m_a=a;
this.addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
m_a.doSomething();
});
}
博马普特m_a;
}
类WidgetCalendar扩展了复合{
AbsolutePanel m_panel=新AbsolutePanel();
m_panel.setStylePrimaryName(“日历”);
m_面板。设置像素大小(宽度、高度);
公共WidgetCalendar(ArrayList应用程序){
initWidget(m_面板);
适用于(BomAppt a:appts){
BomLabel=新的BomLabel();
l、 addClickHandler(新的ClickHandler(){
公共作废一次点击(点击事件){
//我怎么知道我在这里的老板?
}
添加(l,someX,someY);
}
}
}
例如,如果我们查看以下代码;如果 约会收到一个点击,我如何才能找到它的应用程序 代表

通过使用,您可以找到单击了哪个小部件,最初您应该创建自己的自定义约会小部件,负责绘制一个约会。在您的约会小部件中,您可以有一组其他小部件,在您的情况下,用于标签添加单击处理程序。一旦用户单击该标签,您就可以使用其d执行业务逻辑ata,您可以表示数据

public class Appointment extends Composite { 
      private AppointmentDetails data;
      public Appointment(AppointmentDetails data){
           draw(data);
      }

      private void draw(AppointmentDetails data){
         Label label = new Label();
         label.addClickHandler(new ClickHandler() {
         public void onClick(ClickEvent event) {
             // do your business logic with this AppointmentDetails
             }
         });
      }

}
之后,您应该有一个包含多个约会的日历小部件。
请记住:您的每一个类都有一个明确定义的目的,与其他具有明确定义目的的类分开。

当然。我同意这一点-我的问题中确实包含了这一模式。我在寻找更轻的东西。。
class ApptLabel extends Label {
    public ApptLabel(BomAppt a) {
      m_a = a;
  this.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
      m_a.doSomething();
            });
    }

    BomAppt m_a;
}

class WidgetCalendar extends Composite { 
    AbsolutePanel m_panel = new AbsolutePanel();
    m_panel.setStylePrimaryName("calendar");
    m_panel.setPixelSize(width, height);

    public WidgetCalendar(ArrayList<BomAppt> appts) {
       initWidget(m_panel);
       for (BomAppt a : appts) {
          BomLabel l = new BomLabel();
          l.addClickHandler(new ClickHandler() {
    public void onClick(ClickEvent event) {
    // how do I know my BomAppt in here ?                   
       }

          m_panel.add(l, someX, someY);
       }
    }
}
public class Appointment extends Composite { 
      private AppointmentDetails data;
      public Appointment(AppointmentDetails data){
           draw(data);
      }

      private void draw(AppointmentDetails data){
         Label label = new Label();
         label.addClickHandler(new ClickHandler() {
         public void onClick(ClickEvent event) {
             // do your business logic with this AppointmentDetails
             }
         });
      }

}