设置“;已启用";在Vaadin 8`NativeSelect`小部件上设置为false既不会改变其外观,也不会阻止其弹出

设置“;已启用";在Vaadin 8`NativeSelect`小部件上设置为false既不会改变其外观,也不会阻止其弹出,vaadin,popupmenu,vaadin8,Vaadin,Popupmenu,Vaadin8,在Vaadin 8.1.3应用程序中,我在布局上有一个组件,旁边有一个。复选框上的侦听器调用弹出菜单上的setEnabled(NativeSelect),传递true或false 如果false,我希望根据文档,小部件的外观会变暗。我希望单击时弹出菜单不再弹出。这两个期望都没有实现。无论是否启用,小部件的外观都不会改变。小部件在单击时会继续弹出菜单。那太糟糕了 当enabled设置为false时,从菜单中选择一项不再触发事件。响应菜单上的值更改的侦听器不再运行。那很好 这是NativeSelec

在Vaadin 8.1.3应用程序中,我在布局上有一个组件,旁边有一个。复选框上的侦听器调用弹出菜单上的
setEnabled
NativeSelect
),传递true或false

如果false,我希望根据文档,小部件的外观会变暗。我希望单击时弹出菜单不再弹出。这两个期望都没有实现。无论是否启用,小部件的外观都不会改变。小部件在单击时会继续弹出菜单。那太糟糕了

enabled
设置为false时,从菜单中选择一项不再触发事件。响应菜单上的值更改的侦听器不再运行。那很好

这是
NativeSelect
上的错误吗?方法文档承诺:

…用户无法与禁用的组件交互,这些组件以指示状态的样式显示,通常以浅灰色阴影显示

是否有其他方法使
NativeSelect
的外观变暗并禁用其菜单的显示

总之,我在禁用的弹出菜单上查找三种行为:

  • 灰显/暗显外观
  • 单击时不再弹出
  • 单击时不生成任何事件
setEnabled
命令似乎承诺所有三个项目,但只提供最后一个项目

考虑到这是一个“本机”HTML对象,我对这种行为感到惊讶。
select
HTML对象定义为在旧HTML和HTML5中都具有
disable
属性。此属性具有我需要的两种效果:更改显示和使不可单击。请参阅正在禁用的HTML
select
小部件的和

我提交了。

这是因为Vaadin提供了两种方法来调整组件:
setEnabled()
setReadOnly()
——您实际上正在寻找它们

以下是我为您提供的解决方案:

    NativeSelect<String> nativeSelect = new NativeSelect<String>() {
        @Override
        public void setEnabled(boolean enabled)
        {
            super.setEnabled(enabled);
            setReadOnly(!enabled);
            if (enabled)
                removeStyleName("transparency");
            else
                addStyleName("transparency");
        }};
是非 如果禁用和/或只读,则单击时弹出的
NativeSelect
似乎是错误的

您似乎对
NativeSelect
的看法是正确的,它打破了合同,在禁用时显示灰色或类似的视觉提示(“以指示状态的样式显示,通常以浅灰色着色”)

示例应用程序 这里是一个完整的例子,Vaadin 8.1.3/8.1.4在一个类中

package com.example.vaadin.checkbox示例;
导入javax.servlet.annotation.WebServlet;
导入com.vaadin.annotations.Theme;
导入com.vaadin.annotations.VaadinServletConfiguration;
导入com.vaadin.data.HasValue;
导入com.vaadin.server.vaadin请求;
导入com.vaadin.server.VaadinServlet;
导入com.vaadin.ui.*;
导入java.util.ArrayList;
导入java.util.array;
导入java.util.List;
/**
*此UI是应用程序入口点。UI可以表示浏览器窗口
*(或选项卡)或嵌入Vaadin应用程序的html页面的某些部分。
*
*UI是使用{@link#init(VaadinRequest)}初始化的。该方法旨在:
*重写以将组件添加到用户界面并初始化非组件功能。
*
*/
@主题(“神话主题”)
公共类MyUI扩展了MyUI
{
@凌驾
受保护的void init(VaadinRequest VaadinRequest)
{
//小部件
Liststrings=Arrays.asList(“这个”、“那个”、“另一个”、“又一个”);
//违约
final NativeSelectpopupDefault=new NativeSelect(“默认:”,new ArrayList(strings));
setValue(strings.get(3));
popupDefault.addValueChangeListener((HasValue.ValueChangeListener)valueChangeEvent->
{System.out.println(“选择了popupDefault:+valueChangeEvent.getValue());});
//残废
final NativeSelectpopupdabled=new NativeSelect(“Disabled:,new ArrayList(strings));
setValue(strings.get(3));
popupDisabled.addValueChangeListener((HasValue.ValueChangeListener)valueChangeEvent->
{System.out.println(“已选择popupDisabled:”+valueChangeEvent.getValue());});
popupDisabled.setEnabled(false);
//只读
final NativeSelectpopupReadOnly=new NativeSelect(“ReadOnly:,new ArrayList(strings));
setValue(strings.get(3));
popupReadOnly.addValueChangeListener((HasValue.ValueChangeListener)valueChangeEvent->
{System.out.println(“PopuPredOnly selected:”+valueChangeEvent.getValue());});
popupReadOnly.setReadOnly(true);
//禁用和只读
final NativeSelectPopupDisabledReadOnly=新的NativeSelect(“禁用和只读:”,新数组列表(字符串));
PopupDisabledReadOnly.setValue(strings.get(3));
PopupDisabledReadOnly.addValueChangeListener((HasValue.ValueChangeListener)valueChangeEvent->
{System.out.println(“PopupDisabledReadOnly selected:”+valueChangeEvent.getValue());});
PopupDisabledReadOnly.setEnabled(false);
PopupDisabledReadOnly.setReadOnly(true);
//布局
最终垂直布局布局=新垂直布局();
layout.addComponents(popupDefault、popupDisabled、popupReadOnly、popupDisabled和ReadOnly);
设置内容(布局);
}
@WebServlet(urlPatterns=“/*”,name=“MyUIServlet”,asyncSupported=true)
@VaadinServletConfiguration(ui=MyUI.class,productionMode=false)
公共静态类MyUIServlet扩展了VaadinServlet
{
}
}
以下是在Safari技术预览中运行时的屏幕截图br
.transparency {
    opacity: 0.5;
}