Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用LayoutClickListener替换终端组件_Java_Vaadin - Fatal编程技术网

Java 使用LayoutClickListener替换终端组件

Java 使用LayoutClickListener替换终端组件,java,vaadin,Java,Vaadin,我添加了一些字段,如下所示: private Component userDetailsTab(final User user) { final GridLayout details = new GridLayout(2, 1); details.setMargin(true); details.setSpacing(true); details.addComponent(createDetailLabel(Messages.U

我添加了一些字段,如下所示:

 private Component userDetailsTab(final User user) {
        final GridLayout details = new GridLayout(2, 1);
        details.setMargin(true);
        details.setSpacing(true);

        details.addComponent(createDetailLabel(Messages.User_Name));
        final Component username = createDetailValue(user.getName());
        details.addComponent(username);

        ...
 final TextField tf = new TextField();

        details.addListener(new LayoutClickListener() {

            private static final long serialVersionUID = -7374243623325736476L;

            @Override
            public void layoutClick(LayoutClickEvent event) {

                Component com = event.getChildComponent();
                if (event.getChildComponent() instanceof Label) {
                    Label label = (Label)event.getChildComponent();
                    details.replaceComponent(com, tf);
                    tf.setValue(label.getValue());
                }
            }
        });
我还有一个布局单击侦听器,它替换文本字段上的标签,它看起来像:

 private Component userDetailsTab(final User user) {
        final GridLayout details = new GridLayout(2, 1);
        details.setMargin(true);
        details.setSpacing(true);

        details.addComponent(createDetailLabel(Messages.User_Name));
        final Component username = createDetailValue(user.getName());
        details.addComponent(username);

        ...
 final TextField tf = new TextField();

        details.addListener(new LayoutClickListener() {

            private static final long serialVersionUID = -7374243623325736476L;

            @Override
            public void layoutClick(LayoutClickEvent event) {

                Component com = event.getChildComponent();
                if (event.getChildComponent() instanceof Label) {
                    Label label = (Label)event.getChildComponent();
                    details.replaceComponent(com, tf);
                    tf.setValue(label.getValue());
                }
            }
        });
将来,我希望启用单击标签,编辑它,并在单击其他位置(例如,在不同的标签上)后将更改写入数据库


现在,当我点击第一个标签,然后点击第二个标签时,效果是:第一个标签的值为第二,第二个标签的值为第二。为什么会这样?单击第1个,然后单击第2个,得到第1个标签的值1后,我该怎么办?

当我尝试创建单击编辑标签时,它为我带来了大量额外的工作。我不鼓励(并按照巴顿在评论中的建议去做)

但是,如果要坚持尝试创建就地编辑,则需要执行以下操作:

  • 创建一个扩展布局(例如HorizontalLayout)的新类,该类可以将标签替换为文本字段
  • 使用LayoutClickListener删除组件(myLabel)和添加组件(myTextField)
  • 使用BlurListener切换回标签
  • 在文本字段上使用ValueChangeListener将其值复制到标签
这仍然是一个坏主意,因为:

  • 用户不能很容易地看到启示(他们不能告诉什么是可编辑的)
  • 用户不能使用键盘将选项卡指向要编辑的字段
  • 它增加了不必要的复杂性(维护时间等)

我建议,如果您想要就地编辑,只需显示文本字段,并使用BlurListener保存新值。

您不需要在标签和文本字段之间切换,只需使用文本字段,并在其未聚焦时将其设置为标签样式。

为什么要编辑标签?您可以使用文本字段/文本区域进行编辑,然后使用按钮,单击该按钮时,数据必须保存在数据库中。我不能这样做,因为有些标签应该有一行,而它们的文本字段必须大得多,而且我不确定是否可以将文本字段的样式设置为标签