为什么Vaadin ClickListener在第一次点击时没有触发?

时间:2016-08-12 20:03:28

标签: java vaadin

我有一个有几行的表。当用户点击某行时,ItemClickListener会启用一个按钮:

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个选项卡等。

导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

每当触发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");   
    }
});