为什么Vaadin ClickListener在第一次点击时不会触发?
问题描述:
我有一个表有几行。当一排ItemClickListener
用户点击允许按钮:为什么Vaadin ClickListener在第一次点击时不会触发?
testCaseTable.addItemClickListener(new ItemClickListener() {
@Override
public void itemClick(ItemClickEvent event) {
groupForm.tcDetailsButton.setEnabled(true);
System.out.println("_________________");
System.out.println("Item ID is: " + event.getItemId().toString());
System.out.println("Item is: " + event.getItem().toString());
System.out.println("Property ID is: " + event.getPropertyId().toString());
System.out.println("_________________");
}
});
我第一次点击按钮,没有任何反应。第二次点击按钮时,它会正常启动并打开浏览器窗口。
tcDetailsButton.addClickListener(new Button.ClickListener() {
/**
*
*/
private static final long serialVersionUID = 3726094749730769327L;
@Override
public void buttonClick(ClickEvent event) {
BrowserWindowOpener opener = new BrowserWindowOpener(EvoltwebUI.class);
opener.setResource(new ExternalResource("google.com")); //url
opener.setWindowName("_blank");
opener.extend(tcDetailsButton);
}
});
看来,如果我点击我的表2行,然后按一下按钮,它会打开浏览器1个选项卡。如果我点击3行,然后点击按钮,它会打开2个浏览器标签,4行点击= 3个标签打开等。
什么可能导致此?
答
我能够按照上述弗拉基米尔·Kordzik的建议,解决这个问题,而是,我将BrowserWindowOpener的声明和实例移动到类级别,并在点击监听器之前将组件扩展到了开瓶器:
级别声明和安装:
点击之前public BrowserWindowOpener opener = new BrowserWindowOpener(EvoltwebUI.class);
扩展揭幕战:
opener.extend(tcDetailsButton);
点击监听器看起来像现在这样:
tcDetailsButton.addClickListener(new Button.ClickListener() {
/**
*
*/
private static final long serialVersionUID = 3726094749730769327L;
@Override
public void buttonClick(ClickEvent event) {
opener.setResource(new ExternalResource("google.com")); //url
opener.setWindowName("_blank");
}
});
答
每当buttonClick(ClickEvent事件)被触发时,它会添加一个BrowserWindowOpener的新副本,它接收tcDetailsButton。但是,除了第一次,tcDetailsButton已经收到BrowserWindowOpener的前一个副本。每次点击都会重复这种情况,每次都会增加一倍的窗口数量。
我想,你应该buttonClick()法实施前初始化BrowserWindowOpener,像这样:
tcDetailsButton.addClickListener(new Button.ClickListener() {
/**
*
*/
private static final long serialVersionUID = 3726094749730769327L;
final BrowserWindowOpener opener = new BrowserWindowOpener(EvoltwebUI.class);
opener.extend(tcDetailsButton);
@Override
public void buttonClick(ClickEvent event) {
opener.setResource(new ExternalResource("google.com")); //url
opener.setWindowName("_blank");
}
});
感谢您的答复。我试着改变我的代码,但它不会编译。 – PeachesToad
您的评论引导我进行修复。我发布了一个新的答案。请参见。再次感谢。 – PeachesToad
最后陈述缺失。这就是为什么它不编译。 – d2k2