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保存新值。您不需要在标签和文本字段之间切换,只需使用文本字段,并在其未聚焦时将其设置为标签样式。为什么要编辑标签?您可以使用文本字段/文本区域进行编辑,然后使用按钮,单击该按钮时,数据必须保存在数据库中。我不能这样做,因为有些标签应该有一行,而它们的文本字段必须大得多,而且我不确定是否可以将文本字段的样式设置为标签