2013-02-12 27 views
0

我正在使用Eclipse Juno(具有最新的修补程序),最新的GWT和Java。在动态加载的图像上捕获点击事件的最佳方式

我将图像加载到一个可伸缩的相关姓氏和名字连接并显示在每个图像下7 x n网格。我现在想要做的是给每个图像一个独特的名称,并为其分配一个点击处理程序。然后,我会在图像上选取一个点击事件,并在下一个视图中显示该人的详细信息。

是一个可以灵活使用的正确的小部件或者我应该使用不同的小部件来包含图像和名称?

如何给每个图像一个唯一的名称,以便我知道哪个图像被选中?

如何将唯一图像名称传递给onClick监听器?

这是我使用的代码:

public void renderYouthMemberTable(List<YouthMember> youthMemberList) { 
    if (youthMemberList != null) { 
     int row = 0; 
     int col = 0; 
     flexTable.clear(); 
     for (YouthMember youthMember : youthMemberList) { 
      String imageDataString = youthMember.getPhotograph(); 

      //Display each image with the name under it. 
      Image image = new Image(imageDataString); 
      flexTable.setWidget(row, col, image); 
      flexTable.setWidget(row + 1, col, new Label(youthMember.getSurname() + ", " + youthMember.getFirstname())); 

      //Add click handler 
      image.addClickHandler((ClickHandler) this); 

      //Go to next column and if the end of the columns 
      //drop two rows and go to the first column 
      col = col + 1; 
      if (col > 7) { 
       row = row + 2; 
       col = 0; 
      } 
     } 
    } 

} 


public void onClick(ClickEvent event) { 
    // note that in general, events can have sources that are not Widgets. 
    Widget sender = (Widget) event.getSource(); 

    if (sender == image) { 
     // handle image1 being clicked 
     } 
    else if (sender == image2) { 
     // handle image2 being clicked 
    } 
} 

的onClick尚不能工作。这只是为了展示我想要达到的目标。

感谢您的帮助,

格林

+0

是'//手柄此搜索是clicked'和'//处理图像2是clicked'做同样的事情只是一个不同的形象? – NickD 2013-02-13 00:49:19

+0

嗨NickD,是的,他们将(和所有其他人)将控制权传递给下一个视图,其中包含所选人员的ID,以便人员的详细信息显示在视图中。谢谢,格林。 – Glyn 2013-02-13 01:05:41

+0

image.addClickHandler((ClickHandler)这个)看起来很腥吗?什么类型是“这个”!!!! – SSR 2013-02-13 03:33:04

回答

1

我认为柔性表是好的为您的使用情况。

对于点击事件,为什么不做内联?

image.addClickHandler(new ClickHandler(){ 

    @Override 
    public void onClick(ClickEvent event){ 
     // Do something 
    } 

}); 

这种方式你不需要处理射击事件或使用EventBus

如果您需要存储任何其他信息与图像只是扩展Image并添加任何你需要的。尽管如果你实现了像上面这样的点击处理程序,你可能不需要这些信息。

例如:

public class MyImage extends Image{ 

    private String id; 

    public MyImage(String url){ 
     super(url); 
    } 

    public MyImage(String url, String id){ 
     super(url); 
     this.id = id; 
    } 

    public void setId(String id){ 
     this.id = id; 
    } 

    public String getId(){ 
     return id; 
    } 

} 

就用MyImage代替Image

UPDATE: 新增contructors

+0

嗨恩里伯,这是我需要的。我创建了MyImage类,但是当我尝试赋值“最终MyImage myImage = new MyImage(imageDataString);”我得到错误“构造函数MyImage(String)未定义”。由于这扩展了图像,我们应该能够做到“图像图像=新图像(imageDataString);”。我们只是添加了包含ID的功能。下一行“myImage.setId(youthMember.getId());”没问题。我是否需要在图像的MyImage类中重复String代码?还是我做了其他事情呢?感谢您的帮助,Glyn。 – Glyn 2013-02-13 21:26:16

+0

您只需添加上面添加的构造函数即可。请注意,您需要调用'super()'来调用父类的构造函数。你可以用任何父类的构造函数调用'super()',但是你必须确保'super()'调用必须是构造函数中的第一个语句。 – enrybo 2013-02-13 21:35:47

+0

嗨恩里博,非常感谢。我一直在试验这个,并发现了这一点。也就是说,我不需要类,因为你说的id是与图像相关联的。我没有完全理解没有课程的情况,并且手动将id与图像相关联。这是我的功课!我非常感谢你的帮助。我正在创建这个项目的博客教程(为我的高级童军领袖培训提供一个木质徽章项目),我会确保我提到你和所有其他帮助过我的人。问候,格林。 – Glyn 2013-02-14 01:44:52