当前位置: 首页 > 知识库问答 >
问题:

Vaadin 8使用图像作为按钮。不触发点击事件

戴原
2023-03-14

我正在构建一个Vaadin 8应用程序(第一个对我来说)。我正在使用设计器来生成 UI。我在仪表板中添加了几个按钮,单击这些按钮时应该会触发一个函数。由于某种原因,单击图像时不会触发任何内容。以下是涉及的所有代码。谁能看出我做错了什么?

这是. html文件中的代码:

<vaadin-horizontal-layout responsive width-full margin>
    **<vaadin-image icon="theme://images/properties.png" style-name="my-image-button" responsive alt="" _id="imagePropertyInfo"></vaadin-image>**
    <vaadin-image icon="theme://images/occupants.png" responsive alt="" _id="imageOccupants"></vaadin-image>
    <vaadin-image icon="theme://images/vendors.png" responsive alt="" _id="imageVendors"></vaadin-image>
   </vaadin-horizontal-layout>

这是 scss
.my-image-button { cursor: pointer; }

下面是来自Dashboard UI public Dashboard homeview(OnCallUI OnCallUI){ this . OnCallUI = OnCallUI;

        // Make it disabled until a property is selected
        **imagePropertyInfo.setEnabled( false );
        imagePropertyInfo.setStyleName( "my-image-button" );**
        fetchPropertyBasicInfo();
    }

    protected void fetchPropertyBasicInfo()
    {
        List<PropertyProfileBasic> listOfPropertyProfiles = new ArrayList<PropertyProfileBasic>( OnCallUI.myStarService.fetchAllPropertyProfileBasicInformation() );
        comboBoxGeneric.setCaption( "Select a Property" );
        comboBoxGeneric.setItemCaptionGenerator( aProperty -> aProperty.toString() );
        comboBoxGeneric.setItems( listOfPropertyProfiles );
        comboBoxGeneric.addValueChangeListener( event -> fetchOccupantBasicInfo( event ) );
        comboBoxGeneric.focus();
    }

    protected void fetchOccupantBasicInfo( ValueChangeEvent<PropertyProfileBasic> event )
    {
        // Fetch all the occupants for the selected property
        if( event.getValue().getPropertyNo() != null )
        {
            //  Fetch a list of occupant basic info for the selected property
            List<OccupantProfileBasic> listOfOccupantProfiles = new ArrayList<OccupantProfileBasic>( OnCallUI.myStarService.fetchOccupantProfileBasicByPropertyNo( event.getValue().getPropertyNo() ) );
            //  Clear the existing grid et al
            gridContainer.removeAllComponents();
            //  Add the occupant grid
            occupantGrid = new OccupantProfileBasicGrid( listOfOccupantProfiles );
            //  Show the grid
            gridContainer.addComponents( new Label( "Occupants" ), occupantGrid );

            //  Set the dashboard buttons to enabled now a property is selected
            **imagePropertyInfo.setEnabled( true );
            // Add the property info button
            imagePropertyInfo.addClickListener( e -> fetchPropertyInformation() );**
        }
    }

    protected void fetchPropertyInformation()
    {
        Notification.show( "Yo!", "You clicked!", Notification.Type.HUMANIZED_MESSAGE );
    }

共有1个答案

屈翰飞
2023-03-14

我假设你正在使用GridLayout。我建议采用另一种方法。使用按钮,并将按钮样式设置为无边框(显然你想要类似的东西。按钮的图标可以是使用主题资源的主题中的图像。“伪代码”是这样的:

ThemeResource icon = new ThemeResource("/images/properties.png");
Button imagePropertyInfo = new Button(icon);
imagePropertyInfo.setStyleName(ValoTheme.BUTTON_BORDERLESS);
imagePropertyInfo.addClickListener( e -> fetchPropertyInformation() );

另请注意,Image组件的JavaDoc说。

“public Registration addClickListener(MouseEvents.ClickListener侦听器)向组件添加一个单击侦听器。每当用户在组件内单击时,都会调用该侦听器。根据内容,事件可能会被阻止,在这种情况下,不会触发任何事件。”

我认为它不喜欢你用主题设置图像的方式,没有使用资源。

如果您想删除按钮的焦点高亮,应该可以通过以下CSS规则:

.v-button-link:after {
  content: none;
}

另外值得一提的是,图像不是可聚焦的,而按钮是。这意味着即使该图像也可以具有单击侦听器,它无法通过键盘导航到达,按钮可聚焦并通过选项卡等到达。因此,使用按钮而不是图像使您的应用程序更易于访问。

 类似资料:
  • 问题内容: 似乎是一个简单的问题,但解决其他问题的方法似乎对我没有用。 试图通过单击按钮来触发AJAX请求,但似乎并未触发。 HTML示例 javascript 问题答案: 您拥有的代码在拨弄中工作得很好。初始页面加载后,按钮是否通过AJAX动态呈现? 用 代替

  • 问题内容: 我想将图像用作Java中的按钮,而我尝试这样做: 但这仍然显示图像后面的实际按钮,我只想将图像用作按钮,我该怎么做? 问题答案: 像这样删除边框: 然后还有内容1: 1:来自@ 3sdmx添加到问题中的解决方案

  • 问题内容: 这是我想做的事情:单击页面上的一个按钮,这又使(2)事情发生: 显示一个ModalPopup,以防止用户按下任何按钮或更改值 在方法后面调用我的代码,完成后隐藏ModalPopup 这是ASP标记: 现在,这是我在C#代码后面的代码: 为什么不起作用?ModalPopup可以完美显示,但是btnSaveData_Click事件从不触发。 更新: 第一个建议对我不起作用。我还尝试了您的第

  • 当按钮单击时,是否有任何机制显式地触发按键事件。当我单击java UI中命名为“+”的按钮时,它将显式地触发“+”键按下事件。

  • 我在一个页面上有两个GridView,每个GridView都在代码隐藏中被修改为使用RowDataBound进行分组,在RowDataBound中,我为每个分组添加了一个文本框和按钮。该按钮将添加一个单击事件。此外,每个GridView都位于UpdatePanel中。 为了解决RowDataBound项和动态控件的回发问题,我添加了一个简单的响应。重定向到同一页。这段代码可以工作,但按钮会在Gri

  • 我正在开发一个chrome扩展。有一个第三方网站是用Vuejs开发的。我需要触发页面上按钮的点击事件。但当我使用JavaScript执行此操作时,页面将重新加载,但当用户手动单击按钮时,它将处理验证&如果任何验证失败,则不要重新加载。 我使用以下代码来单击按钮(jQuery代码): 注意:上面的代码正确地启动了相关控件的click事件,但是页面重新加载而不是等待验证结果。另外,如果我使用JavaS

  • 我能找到的每个更改按钮图像的示例都显示了当单击该按钮时如何更改它。但是我如何点击一个切换按钮,并让它改变一个常规按钮的图像呢? 关于更多细节,我有两个按钮和一个onCheckedChanged事件: 当按下切换按钮并发生onCheckedChanged事件时,我需要将btn1的背景设置为新图像。