0

我有一些像这样添加的字段的网格布局:

 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());
                }
            }
        });

将来我想启用点击标签,编辑它并在点击其他地方(例如在不同的标签上)后将更改写入数据库。

现在,当我单击第一个标签,然后单击第二个标签时,效果是:第一个具有第二个值,第二个是第二个值的文本字段。为什么会这样?单击第一个然后第二个获得第一个标签女巫值第一个后我该怎么办?

4

2 回答 2

1

您无需在 Labels 和 TextFields 之间进行交换,您只需使用 TextField 并在未聚焦时将其设置为 Label 即可。

于 2013-02-08T08:47:17.890 回答
0

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

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

  • 创建一个扩展布局的新类(例如 Horizo​​ntalLayout),它可以将标签换成文本字段
  • 使用 LayoutClickListener removeComponent(myLabel) 和 addComponent(myTextField)
  • 使用 BlurListener 换回标签
  • 在文本字段上使用 ValueChangeListener 将其值复制到标签

这仍然是一个坏主意,因为:

  • 用户不能轻易地看到可供性(他们不知道什么是可编辑的)
  • 用户无法使用键盘跳到他们想要编辑的字段
  • 它增加了不必要的复杂性(维护时间等)。

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

于 2013-02-07T18:51:28.910 回答