Java 在动态加载的图像上捕获单击事件的最佳方法
我正在使用EclipseJuno(带有最新补丁)、最新的GWT和java 我正在将图像加载到一个flextable中,将相关的姓氏和名字连接起来,并显示在一个7 x n的网格中的每个图像下面。我现在要做的是为每个图像指定一个唯一的名称,并为其指定一个单击处理程序。然后,我将在图像上拾取一个单击事件,并显示下一个填充了此人详细信息的视图 flextable是用于此目的的正确小部件,还是应该使用其他小部件来包含图像和名称 如何为每个图像指定一个唯一的名称,以便我知道选择了哪个图像 如何将唯一的图像名称传递给onClick侦听器 这是我正在使用的代码:Java 在动态加载的图像上捕获单击事件的最佳方法,java,eclipse,gwt,Java,Eclipse,Gwt,我正在使用EclipseJuno(带有最新补丁)、最新的GWT和java 我正在将图像加载到一个flextable中,将相关的姓氏和名字连接起来,并显示在一个7 x n的网格中的每个图像下面。我现在要做的是为每个图像指定一个唯一的名称,并为其指定一个单击处理程序。然后,我将在图像上拾取一个单击事件,并显示下一个填充了此人详细信息的视图 flextable是用于此目的的正确小部件,还是应该使用其他小部件来包含图像和名称 如何为每个图像指定一个唯一的名称,以便我知道选择了哪个图像 如何将唯一的图像名
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
}
}
public void renderyothmembertable(List youthMemberList){
if(youthMemberList!=null){
int行=0;
int col=0;
flexTable.clear();
for(YouthMember YouthMember:youthMemberList){
字符串imageDataString=youthMember.getPhotoshot();
//显示每个图像及其下的名称。
图像=新图像(imageDataString);
setWidget(行、列、图像);
setWidget(行+1,列,新标签(youthMember.getnames()+”,“+youthMember.getFirstname());
//添加单击处理程序
addClickHandler((ClickHandler)this);
//转到下一列,如果列的末尾
//删除两行并转到第一列
col=col+1;
如果(列>7){
行=行+2;
col=0;
}
}
}
}
公共作废一次点击(点击事件){
//请注意,一般情况下,事件可以有非小部件的源。
Widget sender=(Widget)event.getSource();
如果(发送方==图像){
//正在单击的句柄image1
}
else if(发送方==image2){
//处理正在单击的image2
}
}
onClick还不起作用。这就是我想要实现的目标
谢谢你的帮助
Glyn我认为flex表适合您的用例 对于点击事件,为什么不进行内联操作
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
更新:
添加的构造函数是单击的
//句柄image1
和单击的//句柄image2
仅对不同的图像执行相同的操作吗?嗨,NickD,是的,它们都将(和所有其他)将控制权传递到下一个视图,并使用所选人员的id,以便在视图中显示人员的详细信息。谢谢,Glyn.image.addClickHandler((ClickHandler)这个)看起来可疑吗?“这”是什么类型的!!!!嗨,enrybo,这是我需要的。我已经创建了类MyImage,但是当我尝试分配一个值“final MyImage MyImage=new MyImage(imageDataString);“我得到一个错误“构造函数MyImage(String)未定义”。由于这扩展了图像,我们应该能够执行与“图像=新图像(imageDataString);”相同的操作。我们只是添加了包含ID的功能。下一行“myImage.setId(youthMember.getId());”就可以了。我需要为图像重复MyImage类中的字符串代码吗?还是我做错了什么?谢谢你的帮助,格林。你所需要做的就是添加我上面添加的构造函数。请注意,您需要调用super()
,以便调用父类的构造函数。您可以使用父类的任何构造函数调用super()
,但必须确保super()
调用必须是构造函数中的第一条语句。您好,enrybo,非常感谢。我一直在试验这个,发现了这个。也就是说,我不需要您所说的类,因为id与图像相关联。我不完全理解在没有类和手动将id与图像关联的情况下是如何实现的。那是我的家庭作业!我非常感谢你的帮助。我正在为这个项目创建一个博客教程(我的高级童子军领袖培训的一个木头徽章项目),我会确保我提到你和所有帮助过我的人。你好,格林。